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