爲清楚:@FelixKing:是的,我希望this
仍然調用window.foo()
時是不確定的,和這裏的原因:因爲,在JavaScript:
function foo()
{
console.log('I am a function');
}
是(幾乎)同樣的事情:
var foo = function()
{
console.log('I am a function');
}
和foo === window.foo
評估爲真,我希望他們都行爲相似。如果函數是變量,並且JS回退到全局對象(在函數x中,變量沒有被聲明,但是你使用它,JS 氣泡遍歷所有範圍,直到全局對象,直到它找到變量問題,還是在全球範圍內創建它),如果事先指定window
對象,則無關緊要。然而,當你這樣做時,行爲會發生變化,這是我沒有想到的。
我有一個直覺至於爲什麼這是這種情況(我定義的方法,而不是變量),但是再次,對於全局對象,它們之間幾乎沒有什麼區別。 var c = 'Variable'; console.log(window.c === c);
記錄真實等...但我想知道什麼實際上是什麼,以及它是如何工作的(在所有級別上)。
我準備儘可能接受foo.apply(this,[]);
或foo.apply(window,[]);
可以強制this
指向全局對象去,但不是window.foo();
。如果嚴格保護全球對象,我會說這是讓後門敞開。例如,我偶爾會發現自己調用函數,具體取決於變量的值。爲此,我使用window[myVar]();
,嚴格與否,這意味着this
將指向全局對象,而如果我直接調用該函數則不會。就我而言,這是不一致的。
我遇到的嚴格模式this
關鍵字一些怪異的行爲。不要誤解我的意思this
是undefined in strict functions。我發現令人困惑的是,this
可能被迫指向全局對象(或任何其他對象,就此而言),從而有效地破壞嚴格模式提供的安全網。這也有其他影響。考慮以下代碼:
'use strict';//using strict everywhere
(function(Global)
{
var closureObject = {};
Global.foo = function()
{
closureObject.setIn = closureObject.setIn || 'Set in foo';
console.log(this);
console.log(this === Global);
bar();
bar.apply(this);
return (this !== Global ? this : undefined);
};
Global.bar = function()
{
closureObject.setIn = closureObject.setIn || 'set in bar';
console.log(this);
return (this !== Global ? this : undefined);
};
})(this);
var undef = (Math.ceil(Math.random()*10)%2 ? foo() : bar());
foo();//undefined --- false --- undefined --- undefined
window.foo();//Window --- true --- undefined --- window
foo.apply(this,[]);//same as window.foo
同樣適用於自定義對象:
function Foo(n)
{
this.name = n;
}
Foo.prototype.func = foo;//or window.foo
//other objects:
var d = new Date();
foo.apply(d,[]);//Date --- false --- undefined --- date
這,在我看來,是黑客和陷阱的可能來源。更重要的是:它使相當難以確定調用是來自:如果foo()
從全局對象(window.foo();
)呼籲,這方面當然不會傳遞到bar
的,除非bar
將使用稱爲bar.apply(this,[]);
爲什麼我想要一個乾淨,安全和可靠的方法來確定調用者上下文很簡單:我使用閉包來避免那些討厭的全局變量,但同時我設置了一些作爲事件處理程序的函數。
我知道沒有使用嚴格模式,或者設置全局很容易修復,但嚴格模式是留在這裏,我喜歡它帶給派對的東西(好吧,大部分)。我堅信這就是JS發展的方式,我不願意爲自己破碎的代碼哭泣,因爲他不想打擾strict
。這可能不會發生得太快,但我只是想讓我的知識保持最新。
我已閱讀strict
上的MDN頁面,以及John Resig的博客文章,我觀看了很多DC的視頻並閱讀了他的許多文章,但我還沒有找到關於該文章的明確說明我上面描述的行爲。我還沒有讀完整個ECMAScript標準(男孩,那些東西太乾燥了,它可能會耗盡撒哈拉沙漠),但也許這裏有人可能會指出我正確的方向來幫助我更好地理解這一點。
這裏的不一致行爲究竟是什麼?如果你調用'window.foo()',你是否期望'this'也是'undefined'? –
從我這個問題來看,''this''可以很好地被引用,當不在函數中時(在JS中沒有'main()')。正如我所看到的,這正是發生在這裏的事情。 – raina77ow
從我讀過的'這個'沒有指出在嚴格模式下未定義,以避免當它們不應該被設置的全局變量(例如;沒有'new'關鍵字的構造函數)。我期望'window.foo()'不會改變這一點,如果整個問題不是設置全局變量,那麼全局上下文應該被禁止,不是嗎?我的意思是,一致性是什麼嚴格的模式是對的,對嗎?爲什麼然後啓用哈克解決方法? –