JavaScript:万恶的this拿命来(一)


侃侃JavaScript中的this

this为何如此多变?

this总是跟它的执行上下文有关,而在JavaScript总会有开辟新的执行上下文的东西,比如函数,所以,this才如此的变化。

执行环境对JavaScript中的this有影响吗?

JavaScript是一门解释型语言,需要有一个执行环境去执行它,通常的执行环境是浏览器,还有node脚本,还有`REPL`(“读取-求值-输出”循环(Read-Eval-Print Loop,简称REPL))。

如果对REPL有兴趣的话,博客中的另一篇文章介绍了`REPL`

this默认指代谁?

在不同的执行环境中,会指代不同的对象

浏览器中:

> this              // Window {top: Window, window: Window,...
> this === window   //true

> var a = 1;        //在全局中,用var声明变量,会默认给window添加
> this.a   // 1
> window.a // 1
> b = 1;            //不使用var声明变量,会默认给全局的this添加属性
> this.b   // 1
> window.b // 1

在node脚本中

console.log(this);              //{}
console.log(this === global);   //false
console.log(this === window);   //ReferenceError: window is not defined

var a = 1;         //在全局中,使用var声明变量,未给global添加属性

console.log(this.a);            //undefined
console.log(global.a);          //undefined
console.log(window.a);          //ReferenceError: window is not defined

b = 1;            //不使用var声明变量,会默认给全局的global添加属性。

console.log(this.b);            //undefined
console.log(global.b);          // 1   

在node脚本中,this默认指向一个空对象,并不是指向global,也不是指向window。

在REPL中

> this
{ DTRACE_NET_SERVER_CONNECTION: [Function],
  DTRACE_NET_STREAM_END: [Function],
  ...
> global === this  //true

> var a = 1;       //在全局中,使用var声明变量,会默认给全局的global添加属性
> this.a           // 1
> global.a         // 1

> b = 1;           //不使用var声明变量,会默认给全局的this添加属性
> this.b           // 1 
> global.b         // 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>