每个函数在被定义时,就会有一个[[scope]]属性,这个属性里保存着作用域链,而执行的前一刻都会创建一个OA对象,这个对象就是执行上下文,这个OA对象会被插入[[scope]]中作用域链的最顶端,这个对象里保存着函数体声明的所有变量、参数和方法。其实执行期上下文就是作用域,执行上下文的集合就是作用连,其本质就是存在[[scope]]属性中的一个OA对象的有序列表。
window.k是对象属性,k是变量。对象属性即使未定义也会返回undefined,但变量未定义就会报错。
不知道啊,我刚才还找呢,没找到。
当然是函数啦
外层加上()或!或+是为了把函数声名变成函数表达式,防止函数被前置处理而剩下括号或者你省略名字的时候会报语法错误
没有错,我复刻了代码
AO里的a,b,c,d,e前后顺序与填充顺序无关,只是按字典顺序好看而已。AO是最终得到的结果。
JavaScript权威指南 ,封面是一头大犀牛
var foo = 1;
function main (){
console.log(foo); // function foo ()
var foo = 2;
function foo (){
console.log(foo);
}
console.log(this.foo); // main();时为1 new main();时为undefined
this.foo = 3;
console.log(this.foo); // 3
}
main();
new main();
当用new来构造函数时,this的指向是 new main()的原型main();,this.foo就是main()中的function foo(),而变量申明var foo = 2;因为和function foo()重复,就会被忽略,在执行上下文时function foo ()会被提前,值暂时为undefined,所以console.log(this.foo);会返回undefined,这是我自己的理解,希望对你有帮助,有错误望老师纠正~
哪里呀?我还是没找到
是的,function a(){}只有声明过程;
顺序是这样的:1.function a(){return 5;}进行函数声明;
2.var a被忽略;
3.var a=1使a被赋值为1,并覆盖掉了函数声明,使a变成了number
然后强制输出a()是执行函数的语句,a不是函数当然报错了~
这个是让你理解js引擎初始化全局VO中的,[[global]] = { ... window: global}; 意思是window指向的是全局的VO,所以window无限循环下去都是指向全局的VO
1,2,3步里写的只是变量声明的步骤,func=1属于执行步骤没写在里面
个人理解:
初始化阶段: a:undefined foo:<ref of function>
执行阶段: a:1 foo:function(){ /*function*/};
然后function内开始初始化,初始化后由于没有调用,所以没有执行阶段。
然后foo()调用,开始function内部的执行阶段
在代码块中的变量声明会被隐式地提升到封闭函数的顶部!
比如 上面代码可以这样写:
var x; function x(){} alert(x); x=10; alert(x); x=20; //function x(){}; 这块代码被提升了 alert(x); if(true){ var a=1; }else{ var b=true; } alert(a); alert(b);
如果没有function x(){}的话,第一个弹出的应该是 undefined !
变量初始化阶段,所有变量声明都会提前处理,并且初始化值为undefined
而赋值语句是在代码执行阶段触发的,经过赋值改写了变量值再alert自然就是修改之后。而变量/函数的声明,是前置处理的。
不用谢。。。。。。。
声明前置处理,但赋值不会。
也就是说,var o = 1;
这里的var o;被前置处理。
而o = 1// 赋值,是在后面的代码执行阶段做的,所以alert写在前后当然有差别。
哪些书都可以,重点是你怎么看,并且有没有实践。
想要深入,个人推荐《JavaScript权威指南》