国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

this的五種不同情形

Hydrogen / 377人閱讀

摘要:的五種不同情形默認(rèn)情況在默認(rèn)的,純粹的函數(shù)調(diào)用時,視作全局性調(diào)用,此時的指向全局對象,在瀏覽器環(huán)境下,也即對象。構(gòu)造函數(shù)當(dāng)一個函數(shù)被當(dāng)做構(gòu)造函數(shù),用關(guān)鍵字新建一個對象的時候,這個函數(shù)內(nèi)部的以及原型鏈上的都會指向這個新建的對象。

this的五種不同情形 默認(rèn)情況

在默認(rèn)的,純粹的函數(shù)調(diào)用時,視作全局性調(diào)用,此時的this指向全局對象Global,在瀏覽器環(huán)境下,也即window對象。

window.x = "Jackie"

function func() {
  console.log(this.x)
}

func() // Jackie

在嚴(yán)格模式("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 Window
call、applybind 的顯式綁定

call、applybind都可以改變一個函數(shù)的this指向。

callapply

callapply會將它們的調(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"

當(dāng)傳入的第一個參數(shù)為undefined,或者不傳入?yún)?shù)時,在非嚴(yán)格模式下,自動會將this指向全局對象Global,在瀏覽器里是window對象,嚴(yán)格模式下則會是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

callapply沒有本質(zhì)區(qū)別。唯一的區(qū)別在于:

call()方法接受的是若干個參數(shù)的列表,而apply()方法接受的是一個包含多個參數(shù)的數(shù)組。

bind

bind和前面兩者也并未有什么本質(zhì)的區(qū)別,只不過bind將第一個參數(shù)綁定當(dāng)調(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"
構(gòu)造函數(shù)

當(dāng)一個函數(shù)被當(dāng)做構(gòu)造函數(shù),用new關(guān)鍵字新建一個對象的時候,這個函數(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對象,在嚴(yán)格模式下也一樣。因為超時調(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進(jìn)行修改
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"},構(gòu)造函數(shù)綁定的優(yōu)先級高于bind的顯式綁定

可以見得,優(yōu)先級從高到低:

new,構(gòu)造綁定

bind,顯式綁定

call/apply,顯示綁定

作為方法綁定

默認(rèn)綁定

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/84404.html

相關(guān)文章

  • this五種指法

    摘要:中只有的作用域是動態(tài)作用域的五種綁定初學(xué)時,會想當(dāng)然認(rèn)為遵循某一條規(guī)律,就像物理學(xué)那樣,然而并不是。的綁定分為五種情況,這五種情況之間毫無規(guī)律可言。以至指向更加撲朔迷離。 this 到底指向哪里 以下如果沒提及,則為嚴(yán)格模式。 js中作用域有兩種: 詞法作用域 動態(tài)作用域 詞法作用域 詞法作用域指在書寫代碼時就被確定的作用域。看如下代碼 var value = 1; ...

    Caizhenhao 評論0 收藏0
  • React Native 傳參五種方式

    摘要:在中由于業(yè)務(wù)的需要我們往往要在諸多的頁面間,組件之間做一些參數(shù)的傳遞與管理在這里我總結(jié)了幾大經(jīng)過驗證,穩(wěn)定好用的方式給大家導(dǎo)航傳值推薦指數(shù)適用范圍相鄰頁面間傳值兼容性原理為頁面的上掛載了對象可用來做路由跳轉(zhuǎn),在做頁面跳轉(zhuǎn)時可以攜帶參數(shù)回調(diào)方 在React Native 中由于業(yè)務(wù)的需要, 我們往往要在諸多的頁面間,組件之間做一些參數(shù)的傳遞與管理, 在這里我總結(jié)了幾大經(jīng)過驗證,穩(wěn)定好用的...

    cnTomato 評論0 收藏0
  • 實現(xiàn)compose五種思路

    好久沒有更新了,最近學(xué)習(xí)的過程中一直在用聯(lián)想的思維來去看問題,javascript是一門非常靈活的語言,集合了好多語言的特性和多種編程模式,對于compose的實現(xiàn),就有非常多的思路,每一種思路都有自己的特點,實現(xiàn)之后,有種殊途同歸的快感。下面就是我總結(jié)的實現(xiàn)compose函數(shù)的五種思路。 面向過程 函數(shù)組合(reduce) 函數(shù)交織(AOP編程) Promise(sequence) Gener...

    RayKr 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<