摘要:實際上就是做了這樣一件事情顯式的指定是回顧一下隱式模式顯示模式觀點里所有函數(shù)都接受個參數(shù)第一個第二個是函數(shù)被調(diào)用時一定會有這個參數(shù)如果你用調(diào)用函數(shù)就是顯式的傳遞和如果你用語法直接調(diào)用函數(shù)那就去幫你偷偷的傳遞。
JS面向?qū)ο笾総his】 (對象和函數(shù)之間的關(guān)系)
上一篇,談了對象和對象的關(guān)系,現(xiàn)在我們談?wù)剬ο蠛秃瘮?shù)的關(guān)系
先說結(jié)論,也就是觀點1
觀點1: JS里函數(shù)和對象沒有關(guān)系,JS之父通過this將他們強行關(guān)聯(lián)起來首先我們根據(jù)場景,去理解this的出現(xiàn)可以解決什么問題。
var obj = { name : "ziwei", sayName: function(x){ return console.log("hello," + x.name) } }
現(xiàn)在我們不用this,我們就只能這樣調(diào)方法
obj.sayName(obj)
但是一般而言,我們用obj調(diào)用sayName,肯定就是希望讓這個對象說自己的名字
為了能夠obj.sayName(),讓這個obj自己的傳遞進去,JS之父發(fā)明了this.
this的出現(xiàn),就可以解決obj.sayName(obj)時,不用自己傳遞obj進去,而是直接obj,sayName(),讓JS會幫你傳遞obj參數(shù)進去
你可以理解為JS做了一件事情,就是你每次調(diào)用函數(shù)時,都偷偷給你傳遞了一個參數(shù),你用this就可以拿到這個參數(shù)。
var obj = { name : "ziwei", sayName: function(){ return console.log("hello," + this.name) } } obj.sayName()
但是這樣,其實對于新手很不友好。我obj.sayName(),根本沒傳遞參數(shù),那他是怎么輸出obj的name的呢?
所以JS偷偷的傳遞this參數(shù)這件事情,我們將它顯式的展出來就好理解了。
實際上,JS就是做了這樣一件事情,顯式的指定this是obj. obj.sayName.call(obj)
回顧一下:
隱式模式: obj.sayName()
顯示模式: obj.sayName.call(obj)
JS函數(shù)被調(diào)用時,一定會有這2個參數(shù)
如果你用call()調(diào)用函數(shù),就是顯式的傳遞this和arguments
如果你用()語法直接調(diào)用函數(shù),那JS就去幫你偷偷的傳遞this。它怎么幫你傳遞呢? 這個問題暫時不管,下面會說。
JS其實為了用this,想了很多折中方案。
包括(1)函數(shù)調(diào)用有兩種語法 , 把函數(shù)的參數(shù)劃分為this和arguments
一個三段論
論點1: JS函數(shù)的參數(shù)的值,只有在傳參時才確定的
論點2: this是函數(shù)的參數(shù)
推論: this的值,只有在函數(shù)調(diào)用時才確定
JS偷偷幫你傳遞參數(shù)的規(guī)則 (也就是你使用()語法調(diào)用時)
在全局作用域下調(diào)用函數(shù),默認是window (這個是歷史遺留bug),或者你也可以理解為window對象調(diào)用的函數(shù)
哪個對象調(diào)用的,這個this就指向誰
構(gòu)造函數(shù)里this指向構(gòu)造函數(shù)的實例
call、apply、bind都是顯式的傳遞this了,不用多說
箭頭函數(shù)里沒有this,如果你非要寫一個this,那這個this跟外面的this一致
做幾個題目這個this是誰? function a(){ console.log(this) } 答案: 不確定,this是參數(shù),函數(shù)沒有調(diào)用,怎么確定參數(shù)的?
function a(){ "use strict" console.log(this) } a() 答案: undefined, 嚴格模式下, 全局作用域下this不再是window,而是undefiend
新手不會this的主要原因,是不清楚函數(shù)的另一個調(diào)用方式call(),
因為用call()就是自己傳遞this, 用()就是JS偷偷幫你傳遞this,既然是JS按照他自己的規(guī)則,偷偷給你傳遞的,你肯定要懵逼搞不清的
就像手動檔和自動擋開車一樣
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92413.html
摘要:創(chuàng)建模型并設(shè)置關(guān)聯(lián)關(guān)聯(lián)關(guān)系設(shè)置模型關(guān)系一個對應(yīng)多個,一個對應(yīng)多個。手動在中增加關(guān)聯(lián)關(guān)系。并且是實現(xiàn)了數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系,比如一個對應(yīng)多個,如下圖。 文章來源:模型高級特性,引入模型關(guān)聯(lián)關(guān)系 接著前面五篇: 環(huán)境搭建以及使用Ember.js創(chuàng)建第一個靜態(tài)頁面 引入計算屬性、action、動態(tài)內(nèi)容 模型,保存數(shù)據(jù)到數(shù)據(jù)庫 發(fā)布項目,加入CRUD功能 從服務(wù)器獲取數(shù)據(jù),引入組件 前言 ...
摘要:屬性是一個值或一組值以數(shù)組或?qū)ο蟮男问剑菍ο蟮某蓡T。可以使用內(nèi)置構(gòu)造函數(shù)和創(chuàng)建包裝對象。因此下面的代碼將會使人很迷惑結(jié)果結(jié)果,此數(shù)組長度為應(yīng)該盡量避免使用數(shù)組構(gòu)造函數(shù)創(chuàng)建新數(shù)組。給數(shù)組對象添加返回數(shù)組中最大元素值的方法。 對象部分 Object類型 Object 是一個無序的集合,可以存放任意類型對象,所有其他對象都繼承自這個對象。創(chuàng)建Object類型有兩種,一種是使用new運算符,...
閱讀 1063·2019-08-30 12:57
閱讀 2153·2019-08-30 11:11
閱讀 2188·2019-08-29 15:20
閱讀 1879·2019-08-29 14:12
閱讀 3282·2019-08-28 17:51
閱讀 2389·2019-08-26 13:23
閱讀 810·2019-08-26 10:34
閱讀 3872·2019-08-23 12:37