摘要:實驗一全局下的全局作用域下的函數里面的,顯然等于全局對象所以,顯然,可以通過,改變里面的全局變量所以,如果你創建了一個構造函數,然后不小心調用了它,那么相當于你為全局對象賦值了,這個缺陷可以通過里面的來解決。
javascript 中的關鍵詞 this 代指 執行上下文(Execution Contexts),函數作用域中的this,理解上來說是指調用這個函數的對象。相信以下幾個實驗可以加深對this關鍵字的理解。
實驗一:全局下的this全局作用域下的函數里面的this,顯然等于全局對象window
function test(){ console.log(this === window) //true } test()
所以,顯然,可以通過this,改變window里面的全局變量
var global = "global" function test(){ this.global = "global2" } test() console.log(global)//global2
所以,如果你創建了一個構造函數,然后不小心調用了它,那么相當于你為全局對象賦值了,這個缺陷可以通過ES5里面的"use strict"來解決。
"use strict"; var global = "global" function test(){ console.log(this)//undefined this.global = "global2"http://TypeError because "this" undefined } test();
嚴格模式下,全局模式下的函數內部的this為undefined,而不會默認為window
實驗二 : 對象中的this通過普通對象聲明的函數this
var myobject = { foo : function(){ console.dir(this) //myobject } } myobject.foo()
foo里面的this指向調用foo的對象myobject,這個對象里面只有一個方法foo,因此我們可以通過this操作 指向對象 里的其他值
var myobject = { v : 5, foo : function(){ this.v ++ console.log(this.v)//6 } } myobject.foo()
多層對象的情況下,this指向最近的一個對象,即誰直接調用這個函數,誰是this
var myobject = { foo : { bar : function(){ console.dir(this)//foo } } } myobject.foo.bar()
以上情況this指向foo對象,那么我們再考慮如下的情況
var myobject = { foo : function(){ console.dir(this)//myobject var bar = function(){ console.dir(this)/*window "use strict" undefined*/ } bar() } } myobject.foo()
我們可以發現,如果在foo函數里聲明新的函數(閉包),比如綁定事件,settimeout里的匿名函數等情況,這里面的this會變為window(嚴格模式下undefined)。
造成這個錯誤的原因是,bar()調用的時候,是全局對象window在調用的它,而不是通過myobject調用(換句話說myobject里面壓根就沒有bar),這種情況下如果要通過myobject調用bar需要用到call或apply
var myobject = { foo : function(){ console.log(this)//myobject var bar = function(){ console.log(this) } bar.call(myobject)//myobject } } myobject.foo()
理解為,函數中的this,跟調用時的情形有關。
構造函數通過new來賦值情形也跟對象類似,比如
function testobject(){ this.kk = 6; this.dd = function(){console.log(this)}; } var fish = new testobject fish.dd(); /* [object Object] { dd: function (){window.runnerWindow.proxyConsole.log(this)}, kk: 6 } */
new操作符會將this指向構造函數構造出來的對象
實驗三:事件回調里的thisvar myobject = { foo : function(){ console.log(this)//myobject document.body.onclick = function(){ console.dir(this)//[object HTMLBodyElement] } } } myobject.foo()
點擊回調里的this指向點擊對象
總結:解決辦法為避免this混亂,可以采用下面幾種方法
通過變量傳遞var myobject = { foo : function(){ var that = this document.body.onclick = function(){ console.dir(that)//myobject } } } myobject.foo()通過call或apply
var myobject = { foo : function(){ var bar = function(){ console.log(this) } bar.call(myobject)//myobject } } myobject.foo()直接用對象名代替this
var myobject = { v : 5, foo : function(){ var bar = function(){ console.log(++myobject.v)//直接修改myobject對象里的值 } bar(); } } myobject.foo()更多相關請參考
http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html
http://javascript.ruanyifeng.com/oop/basic.html
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/this#Function_context_.E5.87.BD.E6.95.B0.E4.B8.8A.E4.B8.8B.E6.96.87
http://ryanmorr.com/understanding-scope-and-context-in-javascript/
http://stackoverflow.com/questions/9468055/what-does-new-in-javascript-do-anyway
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87520.html
摘要:可能不會包括所有的語法提案。事實上,有些提案已經被擱置很多年了。因此,很可能也會在今年月份發布。 譯者按: 又過了1年... 原文:Whats New in JavaScript for 2019 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。 最近這些年,ECMASCript標準發展節奏非常穩定,每年都會發布新的特...
摘要:一般來說,聲明式編程關注于發生了啥,而命令式則同時關注與咋發生的。聲明式編程可以較好地解決這個問題,剛才提到的比較麻煩的元素選擇這個動作可以交托給框架或者庫區處理,這樣就能讓開發者專注于發生了啥,這里推薦一波與。 本文翻譯自FreeCodeCamp的from-zero-to-front-end-hero-part。 繼續譯者的廢話,這篇文章是前端攻略-從路人甲到英雄無敵的下半部分,在...
摘要:最近做了個上的的測試題目地址,錯了一大堆,感覺的概念還有很多不是很清晰,這里記錄一下個人博客文章地址第一題解答這里考的是的用法。如果出現的數字不符合后面輸入的進制,則為,所以第二個值為。 最近做了個heroku上的JavaScript的測試(題目地址),錯了一大堆,感覺js的概念還有很多不是很清晰,這里記錄一下 個人博客文章地址 第一題 What is the result of...
摘要:標簽前端作者更多文章個人網站 Learning Notes - Understanding the Weird Parts of JavaScript 標簽 : 前端 JavaScript [TOC] The learning notes of the MOOC JavaScript: Understanding the Weird Parts on Udemy,including...
For the most part, in JavaScript, what you see is what you get. A value’s a value; there are no tricks. Sometimes however, you want a value that’s based on some other values: someone’s full name, for ...
閱讀 2086·2021-11-23 10:13
閱讀 2794·2021-11-09 09:47
閱讀 2739·2021-09-22 15:08
閱讀 3317·2021-09-03 10:46
閱讀 2233·2019-08-30 15:54
閱讀 915·2019-08-28 18:09
閱讀 2431·2019-08-26 18:26
閱讀 2342·2019-08-26 13:48