2.预编译的执行时间、步骤是什么?有几种?
- 执行时间:执行在函数执行的前一刻
2. 四部曲:
a) 创建AO对象(activation object 执行期上下文)
b) 找形参和变量声明;将变量和形参名作为AO属性名,值为undefined
c) 将实参值和形参统一
d) 在函数题里面找函数声明,值赋予函数体
3. 两种,上面是在函数中,还有一种是在全局中
a) 创建GO对象(Global Object)=== window
b) 找变量声明;将变量名作为AO属性名,值为undefined
c) 在函数题里面找函数声明,值赋予函数体
4. function sum () { console.log(a) }
a,就近原则,先在函数里找,如果没有,就在window中找。
3.预编译题目
第一题:
function fn(a) {console.log(a);var a = 123;console.log(a);function a() {}console.log(a);var b = function() {}console.log(b)function d() {}}fn(1);
第二题:
答案: ƒ a() { }、 123、 123、 ƒ() { } 、1、 2、 2function test(a,b) {console.log(a);c = 0;var c;a = 3;b = 2;console.log(b);function b() { }function d() { }console.log(b);}test(1)console.log(h); //123console.log(c); //报错console.log(a); //报错console.log(b); //报错
a = 100;function demo(e) {function e() {}arguments[0] = 2;console.log(e);console.log(a);console.log(Number(a));console.log(Boolean(a));if(a) {var b = 123;function c() {}}var c;a = 10;var a;console.log(b);f = 123;console.log(c);console.log(a);}var a;demo(1);console.log(a);console.log(f);
2、undefined、NaN、false、 undefined、undefined、10、100、123
4.类型转换题目
- var demo = false == 1;
console.log(demo);
2. if(typeof(a)&&-true + (+undefined) + “”) {
console.log(“基础扎实”);
}
3. if(11 + “11” * 2 == 33) {
console.log(“基础扎实”);
}
4. !!” “ + !!”” - !!false
1 + 0 - 0
Boolean(document.write(“你觉得能打印,你就是猪”));
1:先判断 false ==1 得到 false ,然后赋值给demo
2:typeof(a) 得到 “undefined”, -true得到-1(正负号会隐形转换Number类型),+undefined也会转换Number类型,得到的是NaN—Number类型,加上后面的+“”,变成字符串“NaN”,所以最后是字符串“undefined”+“NaN”。 true
3.乘除号会进行隐性Number转换,最后得到true
4.双非不用管 “ ”是true,“”是false 所以是1+0-0。 最后面是false
5.css都有什么选择器?优先级是什么?
1.标签选择器 p ,div 等
2.id选择器,#first 只能用一次
3.后代选择器, p a ——选择所有p标签内的所有a标签
4.子选择器 p>a 离父亲最近的那个儿子,孙子不算
5.并集选择器 .box , p , h3 用逗号
6.交集选择器 a.special —-a标签中类名为special的标签(注意这里面既有标签也有类名)
选择器的优先级
id选择器>类选择>标签选择器
根据权重+继承性来选择
一般规定id为100,类10,标签为1
<ul class="ul-item"><li><p>文字的颜色到底是什么颜色?</p></li></ul>.ul-item li{color: blue;}p{color: red;}
什么颜色?答案是红色,虽然10+1>1,应该是蓝色。但为什么是红色?
因为他没有选中,没有选中权重再大也无济于事。但是如果把p去掉是什么颜色?
是蓝色,因为这时候是继承性在发挥作用
6.作用域是什么?和作用域链题目
function a() {function b() {function c() {}c()}b()}a()
a defined a.[[scope]] -- > 0 : GOa doing a.[[scope]] -- > 0 : aAO1 : GOb defined a.[[scope]] -- > 0 : aAO1 : GOb doing a.[[scope]] -- > 0 : bAO1 : aAO2 : GOc defined a.[[scope]]-- > 0 : aBO1 : aAO2 : GOc doing a.[[scope]]-- > 0 : cAO1 : bAO2 : aAO3 : GO
如上,在定义和执行时,他的作用域是不一样的,如果不执行,那么将不会生成自己的执行上下文AO,比如function b,如果b不执行,那么b里面一切东西就是封闭的,不会被看到,只有b执行的时候,才会生成AO,然后才能看到里面的东西。
理解这句话:b不执行的时候,他的作用域和a执行时是一样的
而且也说明了,一个变量,总是顺着作用域链,从小到大寻找。
7.作用域和作用域链题目
function a() {function b() {var bbb = 234;console.log(aaa);}var aaa = 123;return b;}var glob = 100;var demo = a();demo();
当var demo=a()时,a执行,此时a的作用域是AO和GO,执行完毕后,a销毁(指向AO和GO的引用线斩断),但是AO和GO却不会消失,因为a返回了b,此时b指向AO和GO,所以AO和GO不会消失。当b执行的时候,会生成自己的AO,但是a的AO和GO仍然在,也就说,b会有三个作用域:bAO、aAO,GO。 所以答案是 123;
8.更深一点的题目
function a() {var num = 100;function b() {num++;console.log(num);}return b;}var demo = a()demo();demo();
同上一题,a执行完后,a被销毁,但是aAO还在,并且不管b(demo)重新调用多少次,所有的b都共同用同一个aAO,(不过每个b会单独生成一个专属bAO),所以答案是101,102
9.立即执行函数执行时会忽略函数名什么意思?
var test = function () {console.log('a');}();console.log(test);
这时候test就不会输出,因为一旦一个函数被立即执行,就会忽略他的函数名字。
所以这里的test就没有了。
注意,这时候输出test是undefined
而test()会报错
+function test() {console.log("a")}();test()
这时候会执行吗?会,因为前面有+号,所以就是表达式了,所以可以执行
+ - ! 可以
*/ 不行
&& 和 || 可以,但是前面得放东西
|| function test() {}
得放东西。
下面的test()会执行吗,不会。因为立即执行函数的执行完就被销毁了,而且他的函数名被忽略了
10.立即执行函数的两种写法是什么?
function(){}() //函数不会执行(function (){}()) //W3C建议第一种(function (){})()
记忆:第一种是函数加()表示立即执行,然后整体加(),变成表达式
第二种是函数整体加括号,表示这是一个函数表达式,然后最后加()执行
总结:两种方法都必须有一个括号变成表达式,不同的是执行括号可以放在里面,也可以放在外面
一个有趣的结果:
function test(a, b, c, d) {console.log(a + b + c + d);}();
这时候会报错:而且是全局扫描时,出错,因为这不符合语法规范。
function test(a, b, c, d) {console.log(a + b + c + d);}(1, 2, 3, 4);
这个时候,不会报错,但是执行之后,什么也不显示,为什么?
其实应该报错,但是系统识别之后,为了能够尽量不报错,会把这段代码识别成这样:
function test(a, b, c, d) {console.log(a + b + c + d);}(1, 2, 3, 4);
两个代码没有任何关系。
11.闭包。最后会输出什么?为什么?
一道关于闭包的题:函数保存到了外面
function test() {var arr = [];for (var i = 0; i < 10; i++) {re[i] = function () {console.log(i + " ");}}return arr;}var myArr = test();for (var i = 0; i < 10; i++) {myArr[i]();}
最后会输出10个10。
那么怎样才能让他从0输出成10呢?立即执行函数+闭包
function test() {var arr = [];for (var i = 0; i < 10; i++) {(function (j) {arr[j] = function () {console.log(j + " ");}}(i))}return arr;}var myArr = test();for (var i = 0; i < 10; i++) {myArr[i]();}
转化的逻辑是什么?很明显,第一个是多个函数公用一个testAO,只需要给他们每一个加一个自己的AO就好了。
