锁定老帖子 主题:关于js作用域的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-31
如果按照规范来说
函数调用时this指向的应该是函数引用的 Base Object,如果Base Object 为 Variable Object, 那么this 指向 Global Object |
|
返回顶楼 | |
发表时间:2011-12-31
2处的undefined 是因为 下面的var name = "def"。其他的不解释
|
|
返回顶楼 | |
发表时间:2011-12-31
用var或function声明的变量,会自动提升(hositing)的当前作用域的最前面,
也就是: var name; alert(name); //2处:undefined name = "def"; alert(name); //3处:def |
|
返回顶楼 | |
发表时间:2011-12-31
function不是对象,里面调用this,就引用window了
|
|
返回顶楼 | |
发表时间:2011-12-31
yoyo837 写道 2处的undefined 是因为 下面的var name = "def"。其他的不解释
|
|
返回顶楼 | |
发表时间:2012-01-02
你写的testGlobal(); 相当于window.testGlobal() 所以this为window; 1处的就不解释了; 2处的原因在于你在testGlobal里面应用了 var name 这样name就是局部变量,覆盖了全局的name, js在函数执行前会扫描局部变量,相当于在函数的最开头写了一个var name, 所以执行到2处时,name虽然声明了,但没有赋值,就是undefined了,当执行到3处时,name已经被赋值了;4处的name是全局的name;6处的原因在于testGlobal函数修改了全局的name变量(this.name, this即window, 全局变量都是window的属性),
|
|
返回顶楼 | |
发表时间:2012-01-02
最后修改:2012-01-02
nail2008 写道 var name = "abc" function testGlobal() { alert(name); //2处:abc name = "def"; } testGlobal(); 你这有问题,不带var的name,是引用的全局变量name,所以,你这里这样写的话,连续执行2次testGlobal(),第二次2处就变成def了。 “黑白两相望”那个是完整正解。 JS函数记住2条: 1) 词法作用域,函数在它的定义位置逐级向上查找变量,这也是JS闭包的原因。 2) this是个隐藏参数,指向实际上调用这个函数的对象,没有则指向全局对象,在浏览器里,就是指像window,跟函数自身的局部变量无关。 |
|
返回顶楼 | |
发表时间:2012-01-02
不定义在对象里的函数,默认都是window的!!
|
|
返回顶楼 | |
发表时间:2012-01-02
个人认为2处的值是受“var name = "def"; ”这句影响,准确来说是由于var,如果没有var 此name为全局的name,也就是abc,现在加上var 表示name为function的局部变量,在function内的name皆为局部的,故有这些结果,可以将var 去掉看看结果,this的解释同上
|
|
返回顶楼 | |
发表时间:2012-01-02
真是误人子弟啊
|
|
返回顶楼 | |