main函数中第一个alert考的是scope chain
。他会现在在main函数中查找是否有foo
变量,没有才回去上层的scope中查找。因为main函数中有声明foo
变量,但是alert
在他赋值之前,所以返回的是undefined。
第二个alert考的是this
指向的问题。
当函数作为一个对象属性被调用时,this
指向的就是他的调用者,即那个对象;
当函数直接被调用时,他的调用者其实就是window
对象;
当函数作为构造函数被执行时,他的this指向的是构造函数实例化出来的对象;
我们还可以使用call/apply
来改变默认的this指向。
主要在于两个问题: this 的值和变量声明提升。
THIS
main() 这样的话,this 是 window
new main() this 是以这个函数为原型新创建的对象,所以在给 this.foo 赋值的前肯定是 undefined
http://zonxin.github.io/post/2015/11/javascript-this
变量声明提升:
所有以 var 这样声明的局部变量都会本人为是定义在该函数的一最开始,而var a=2。而其赋值还是在原来的位置。因此, 在函数里 foo 是 undefined。
其实是js 在执行函数的时候先把函数扫描一遍(ES5.1),定义所有的变量和函数,并赋予初值。然后除去变量和函数声明,执行这个函数。
http://zonxin.github.io/post/2015/10/javascript-hoisting
第一个alert
考的是变量声明提升,实际上执行代码的顺序是:
var foo;
alert(foo);
foo = 2;
所以第一个alert
始终返回undefined
。
第二个alert
考的是this
。
第一次是直接调用,this
指向全局作用域,所以结果是1
。
第二次是作为构造函数调用,this
指向构造的实例对象,在为构造函数初始化属性之前返回this.foo
为undefined
。
this
的值与它在什么地方无关,在于它所在函数被何种方式调用。深入javascript——无处不在的this
8 回答4k 阅读✓ 已解决
6 回答2k 阅读✓ 已解决
5 回答5.7k 阅读✓ 已解决
6 回答1.6k 阅读
4 回答1.9k 阅读✓ 已解决
3 回答2.1k 阅读
5 回答1.9k 阅读✓ 已解决
浏览器执行Js程序的时候,分两步:
我们来分析题目
先预解析,预解析仓库里有:
执行代码:
综上选A