论坛首页 Web前端技术论坛

关于js作用域的疑惑

浏览 11614 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-31  
如果按照规范来说
函数调用时this指向的应该是函数引用的 Base Object,如果Base Object 为 Variable Object,
那么this 指向 Global Object
0 请登录后投票
   发表时间:2011-12-31  
2处的undefined 是因为 下面的var name = "def"。其他的不解释
0 请登录后投票
   发表时间:2011-12-31  
用var或function声明的变量,会自动提升(hositing)的当前作用域的最前面,
也就是:
var name;
alert(name); //2处:undefined   
name = "def";      
alert(name); //3处:def  
0 请登录后投票
   发表时间:2011-12-31  
function不是对象,里面调用this,就引用window了
0 请登录后投票
   发表时间:2011-12-31  
yoyo837 写道
2处的undefined 是因为 下面的var name = "def"。其他的不解释

0 请登录后投票
   发表时间: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的属性),
0 请登录后投票
   发表时间: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,跟函数自身的局部变量无关。
0 请登录后投票
   发表时间:2012-01-02  
不定义在对象里的函数,默认都是window的!!
0 请登录后投票
   发表时间:2012-01-02  
个人认为2处的值是受“var name = "def"; ”这句影响,准确来说是由于var,如果没有var 此name为全局的name,也就是abc,现在加上var 表示name为function的局部变量,在function内的name皆为局部的,故有这些结果,可以将var 去掉看看结果,this的解释同上
0 请登录后投票
   发表时间:2012-01-02  
真是误人子弟啊
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics