作用域和this绝对是javascript中最容易让人栽跟头的地方之一,闲话少说,先问题个问题?
var a = { b: 1, c: function() { alert(this.b.toString()); } } a.c(); b = a.c b();
思考下,再看后面的答案。是不是觉得是:
1
1
公布正确答案
1 function () { console.log(this.b.toString()); }
再看下面这段程序:
var b; var a = { b: 1, c: function() { alert(b); } } a.c(); b = a.c b();
正确答案:
undefined
[Function]
ps:如果你一下子就能答出两道题正确答案,说明你已经比较掌握this的使用,本文可能并不适合你,可以不需要再看接下来的内容
言归正传,为什么是这样的运行结果呢?
主要请记住重要的这么几点:
* JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
* 那就是this指的是,调用函数的那个对象
第一道题中调用b()时,this已经指向全局,所以this.b就是一个函数
第二道题中a.c()和b()得到的是作用域链最外层的全局变量b
参考文章:
作用域链:http://www.laruence.com/2009/05/28/863.html
this用法:http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html