var tt = 'aa';
function test() {
alert(tt);
var tt = 'dd';
alert(tt);
}
test();
起初看这段代码的时候认为执行的结果应该是
aa dd
运行之后才知道不是的,传智博客邹华栋老师给给讲解如下
1.当test方法执行的时候,将会产生test方法的执行环境
2.test执行难个环境中生成了test方法的作用域链
作用域链先包含了当前test方法的所有成员,就包含了方法里面的tt
这个tt在作用域链的最顶端接着这个作用域链加入了window的作用域
那么window的作用域包含了外面声明的tt
那么当test方法执行的时候第一个alert tt的时候浏览器js执行会顺着text的作用域链栈tt,
那么最先是从test方法的作用域中找到了tt,所以,但是这个test方法的tt还没赋值,所以就是undefine
紧接着tt=dd;在alert的时候,就打出了tt了。所以,这个方法里打印的tt就是test方法内部的tt和全局的tt木有关系
var a = 10;
function test() {
a = 100;
alert(a);
alert(this.a);
var a;
alert(a);
}
test();
此代码的分析过程
方法里的this简单来说就是,谁 . 出 这个方法,这个方法里的 . 就是谁;
但是方法里的this可以通过call直接修改,也就是说,我可以在外面传一个值给this
比如 window.alert() 那么 alert方法里的 this就是window如果这么调用 alert.call(1)那么,此时alert方法里的this就等于 1
是现在当前方法的作用域里找,找不到,在到全局作用域里去找
此段代码执行结果以及js作用域链相关内容请看http://www.wenlele.com:8081/View-6-765.aspx