谈谈javascript的作用域链和this

作用域和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

posted @ 2013-02-04 17:56 lengyuhong 阅读(...) 评论(...) 编辑 收藏