Node腳本中g(shù)lobal和this是區(qū)別對(duì)待的,而Node命令行中,兩者可等效為同一對(duì)象
函數(shù)正常被調(diào)用(不帶new)時(shí),里面的this指向的是全局作用域
foo = 'bar';
function testThis() {
this.foo = "foo";
}
console.log(this.foo); //logs "bar"
testThis();
console.log(this.foo); //logs "foo"
還有個(gè)例外,就是使用了"use strict";。此時(shí)this是undefined。
foo = "bar";
function testThis() {
"use strict";
this.foo = "foo";
}
console.log(this.foo); //logs "bar"
testThis(); //Uncaught TypeError: Cannot set property 'foo' of undefined
在JavaScript中,函數(shù)可以嵌套函數(shù),也就是你可以在函數(shù)里面繼續(xù)定義函數(shù)。但內(nèi)層函數(shù)是通過閉包獲取外層函數(shù)里定義的變量值的,而不是直接繼承this。
function Thing() {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
var info = "attempting to log this.foo:";
function doIt() {
console.log(info, this.foo);
}
doIt();
}
var thing = new Thing();
thing.logFoo(); //logs "attempting to log this.foo: undefined"
將實(shí)例的方法作為參數(shù)傳遞,可以將方法理解為堆中的區(qū)域,變量為指向該區(qū)域的指針,當(dāng)a.c -> b,d.e = a.c,變成了d.e ->b,你確定以前的this還是那個(gè)this嗎?記住,對(duì)象間的賦值是引用。
function Thing() {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
console.log(this.foo);
}
function doIt(method) {
method();
}
var thing = new Thing();
thing.logFoo(); //logs "bar"
doIt(thing.logFoo); //logs undefined