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