摘要:的五種不同情形默認(rèn)情況在默認(rèn)的,純粹的函數(shù)調(diào)用時(shí),視作全局性調(diào)用,此時(shí)的指向全局對(duì)象,在瀏覽器環(huán)境下,也即對(duì)象。構(gòu)造函數(shù)當(dāng)一個(gè)函數(shù)被當(dāng)做構(gòu)造函數(shù),用關(guān)鍵字新建一個(gè)對(duì)象的時(shí)候,這個(gè)函數(shù)內(nèi)部的以及原型鏈上的都會(huì)指向這個(gè)新建的對(duì)象。
this的五種不同情形 默認(rèn)情況
在默認(rèn)的,純粹的函數(shù)調(diào)用時(shí),視作全局性調(diào)用,此時(shí)的this指向全局對(duì)象Global,在瀏覽器環(huán)境下,也即window對(duì)象。
window.x = "Jackie" function func() { console.log(this.x) } func() // Jackie
在嚴(yán)格模式("use strict")下,會(huì)禁止this指向全局對(duì)象,此時(shí)的this會(huì)是undefined。
作為對(duì)象的方法調(diào)用此時(shí)this指向調(diào)用這個(gè)方法的對(duì)象。
var x = "Property of Window" var obj = {} obj.x = "Property of obj" obj.f = function () { console.log(this.x) } obj.f() // Property of obj // 值得注意的情況 var f = obj.f f() // Property of Windowcall、apply和bind 的顯式綁定
call、apply和bind都可以改變一個(gè)函數(shù)的this指向。
call和applycall和apply會(huì)將它們的調(diào)用對(duì)象的this指向它們的第一個(gè)參數(shù)。
function f () { console.log(this.x) } var x = "Property of Window" var obj = { x: "Property of obj" } f.apply(obj) // "Property of obj"
當(dāng)傳入的第一個(gè)參數(shù)為undefined,或者不傳入?yún)?shù)時(shí),在非嚴(yán)格模式下,自動(dòng)會(huì)將this指向全局對(duì)象Global,在瀏覽器里是window對(duì)象,嚴(yán)格模式下則會(huì)是undefined:
function f () { console.log(this) } f.apply() // window f.apply(undefined) // window function ff () { "use strict" console.log(this) } ff.apply() // undefined ff.apply(undefined) // undefined
call和apply沒(méi)有本質(zhì)區(qū)別。唯一的區(qū)別在于:
bindcall()方法接受的是若干個(gè)參數(shù)的列表,而apply()方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
bind和前面兩者也并未有什么本質(zhì)的區(qū)別,只不過(guò)bind將第一個(gè)參數(shù)綁定當(dāng)調(diào)用函數(shù)的this上,并將這個(gè)函數(shù)返回(不執(zhí)行)。
function f () { console.log(this.x) } var x = "Property of Window" var obj = { x: "Property of obj" } var ff = f.bind(obj) ff() // "Property of obj"構(gòu)造函數(shù)
當(dāng)一個(gè)函數(shù)被當(dāng)做構(gòu)造函數(shù),用new關(guān)鍵字新建一個(gè)對(duì)象的時(shí)候,這個(gè)函數(shù)內(nèi)部的this以及原型鏈上的this都會(huì)指向這個(gè)新建的對(duì)象。
function Jackie(para) { this.para = para console.log(this) } Jackie.prototype.log = function(){ console.log(this) } Jackie("hehe") // Window var p = new Jackie("haha") // Jackie {para: "haha"} p.log() // Jackie {para: "haha"}其他值得注意的綁定 放在超時(shí)代碼里
JavaScript中超時(shí)調(diào)用的代碼都是在全局作用域中執(zhí)行的,因此函數(shù)中this的值會(huì)指向window對(duì)象,在嚴(yán)格模式下也一樣。因?yàn)槌瑫r(shí)調(diào)用的代碼都會(huì)有一個(gè)隱式綁定:setTimeout(f, time) == setTimeout(f.bind(window), time)。
"use stric" var x = "Property of Window" var obj = {} obj.x = "Property of obj" obj.ff = function () { setTimeout( function () { console.log(this.x) }, 100) } obj.ff() // Property of Window // 可以這么解決問(wèn)題 obj.fff = function () { var that = this setTimeout( function () { console.log(that.x) }, 100) } obj.fff() // Property of obj事件監(jiān)聽(tīng)函數(shù)中的this
事件監(jiān)聽(tīng)函數(shù)中的this指向監(jiān)聽(tīng)對(duì)象。
var one = document.getElementById("one") one.onclick = function () { console.log(this) }; one.click() //箭頭函數(shù)
箭頭函數(shù)中this的指向,在函數(shù)定義時(shí)即綁定完畢,且后續(xù)無(wú)法更改。
var obj = { x: 1 } var f1 = () => { console.log(this) } f1.apply(obj) // Window var f2 = function () { var f3 = () => { console.log(this) } return f3 } var f4 = f2.apply(obj) f4() // Object {x: 1}
一個(gè)更神奇的例子,超時(shí)調(diào)用的代碼在定義時(shí),綁定了this的指向。
function foo() { setTimeout(() => { console.log("id:", this.id); }, 100); } var id = 21; foo.call({ id: 42 }); // id: 42綁定的優(yōu)先級(jí)
var obj = {x: 0, name: "obj"} var robj = {x: -1, name: "robj"} var factory = function (x) { this.x = x console.log(this) } var factoryBind = factory.bind(obj) robj.factory = factoryBind robj.factory(2) // Object {x: 2, name: "obj"},作為方法的綁定的優(yōu)先級(jí)低于bind的顯式綁定 factoryBind.call(robj, 3) // Object {x: 3, name: "obj"},call的優(yōu)先級(jí)低于bind console.log(robj) // Object {x: -1, name: "robj", factory: function},未對(duì)robj進(jìn)行修改 console.log(obj) // Object {x: 3, name: "obj"},修改的是obj,因?yàn)閠his指針指向未變化 var p = new factoryBind(4) // factory {x: 4} console.log(p) // factory {x: 4} console.log(obj) // Object {x: 3, name: "obj"},構(gòu)造函數(shù)綁定的優(yōu)先級(jí)高于bind的顯式綁定
可以見(jiàn)得,優(yōu)先級(jí)從高到低:
new,構(gòu)造綁定
bind,顯式綁定
call/apply,顯示綁定
作為方法綁定
默認(rèn)綁定
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84404.html
摘要:中只有的作用域是動(dòng)態(tài)作用域的五種綁定初學(xué)時(shí),會(huì)想當(dāng)然認(rèn)為遵循某一條規(guī)律,就像物理學(xué)那樣,然而并不是。的綁定分為五種情況,這五種情況之間毫無(wú)規(guī)律可言。以至指向更加撲朔迷離。 this 到底指向哪里 以下如果沒(méi)提及,則為嚴(yán)格模式。 js中作用域有兩種: 詞法作用域 動(dòng)態(tài)作用域 詞法作用域 詞法作用域指在書(shū)寫(xiě)代碼時(shí)就被確定的作用域。看如下代碼 var value = 1; ...
摘要:在中由于業(yè)務(wù)的需要我們往往要在諸多的頁(yè)面間,組件之間做一些參數(shù)的傳遞與管理在這里我總結(jié)了幾大經(jīng)過(guò)驗(yàn)證,穩(wěn)定好用的方式給大家導(dǎo)航傳值推薦指數(shù)適用范圍相鄰頁(yè)面間傳值兼容性原理為頁(yè)面的上掛載了對(duì)象可用來(lái)做路由跳轉(zhuǎn),在做頁(yè)面跳轉(zhuǎn)時(shí)可以攜帶參數(shù)回調(diào)方 在React Native 中由于業(yè)務(wù)的需要, 我們往往要在諸多的頁(yè)面間,組件之間做一些參數(shù)的傳遞與管理, 在這里我總結(jié)了幾大經(jīng)過(guò)驗(yàn)證,穩(wěn)定好用的...
好久沒(méi)有更新了,最近學(xué)習(xí)的過(guò)程中一直在用聯(lián)想的思維來(lái)去看問(wèn)題,javascript是一門(mén)非常靈活的語(yǔ)言,集合了好多語(yǔ)言的特性和多種編程模式,對(duì)于compose的實(shí)現(xiàn),就有非常多的思路,每一種思路都有自己的特點(diǎn),實(shí)現(xiàn)之后,有種殊途同歸的快感。下面就是我總結(jié)的實(shí)現(xiàn)compose函數(shù)的五種思路。 面向過(guò)程 函數(shù)組合(reduce) 函數(shù)交織(AOP編程) Promise(sequence) Gener...
閱讀 2991·2023-04-26 00:23
閱讀 3406·2021-09-13 10:28
閱讀 2185·2021-08-31 14:18
閱讀 2891·2019-08-30 15:54
閱讀 1945·2019-08-30 15:43
閱讀 1284·2019-08-29 16:56
閱讀 2807·2019-08-29 14:16
閱讀 2060·2019-08-28 17:51