成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript的this

happyfish / 2821人閱讀

摘要:的函數(shù)的關(guān)鍵字在中的行為與其他語(yǔ)言稍有不同。嚴(yán)格模態(tài)與非嚴(yán)格模態(tài)也有一定的區(qū)別。在大多數(shù)情況下,這個(gè)值由函數(shù)的調(diào)用方式?jīng)Q定。它不能在定義期間通過(guò)賦值來(lái)確定,而且每次調(diào)用函數(shù)時(shí)它可能是不同的。

Javasctipt 的 this
函數(shù)的this關(guān)鍵字在JavaScript中的行為與其他語(yǔ)言稍有不同。嚴(yán)格模態(tài)與非嚴(yán)格模態(tài)也有一定的區(qū)別。在大多數(shù)情況下,這個(gè)值由函數(shù)的調(diào)用方式?jīng)Q定。它不能在定義期間通過(guò)賦值來(lái)確定,而且每次調(diào)用函數(shù)時(shí)它可能是不同的。ES5引入了bind()方法來(lái)設(shè)置函數(shù)this的值,不管它是如何調(diào)用的,而ES2015引入了箭頭函數(shù),它不提供自己的this綁定(它保留了所包含的詞法上下文的這個(gè)值)。
一、在全局環(huán)境中的this 在瀏覽器環(huán)境中

直接輸出this

console.log(this); // Window
console.log(this === window); // true
console.log(this === Window); // false
window instanceof Window // true

上述結(jié)果說(shuō)明直接輸出this時(shí),輸出的是它的構(gòu)造函數(shù),但它其實(shí)是一個(gè)實(shí)例;

"use strict"
console.log(this); // undefined

嚴(yán)格模式下,全局的this指向undefined

在node環(huán)境中

直接輸出this

console.log(this); // {}

嚴(yán)格和非嚴(yán)格模式都是 {}

二、函數(shù)中的this 直接在全局環(huán)境中調(diào)用,而不是作為某個(gè)對(duì)象的屬性或方法
function fn() {
    return this;
}
let obj = {
    a: 1,
    b: fn
}
fn() // node: global , browser: window
let objFn = obj.b;
objFn(); // node: global , browser: window

// 箭頭函數(shù)
let obj2 = {
    a: 2,
    b: () => this
}
let obj2Fn = obj2.b;
obj2Fn(); // node: global , browser: window

// 立即執(zhí)行函數(shù)
!function(){
    console.log(this === window) // true
}()

let obj = {
    say: function() {
        console.log(this === window) // true
    }()
}
obj.say;

let str = "windows"
let o = {
    str: "o",
    methods: {
        str: "methods",
        fn: function () { console.log(this.str) },
           arrowFn: function() { // IIFE
          let fn = () => { console.log(this.str) } 
          return fn;
           }()
    }
}
o.methods.arrowFn(); // undefined ;此時(shí),this指window;而用let聲明的str變量不會(huì)添加到window對(duì)象上去,所以為undefined;

在嚴(yán)格模式下

function fn() {
    "use strict"
    return this;
}
fn() // undefined
作為對(duì)象的屬性調(diào)用
function fn() {
    return this;
}
let obj1 = {
    a: 1,
    b: fn
}
let obj2 = {
    a: 2
}
obj2.b = obj1.b;
obj1.b(); // {a: 1, b: ?n}
obj2.b(); // {a: 2, b: ?n}

// 箭頭函數(shù)
let obj1 = {
    a: 1,
    b: () => this
}
let obj2 = {
    a: 2
}
obj2.b = obj1.b;
obj1.b(); // node: global , browser: window
obj2.b(); // node: global , browser: window
通過(guò)call 和 apply 方法調(diào)用
如果函數(shù)在其主體中使用this關(guān)鍵字,則可以使用call()或apply()方法將其值綁定到調(diào)用的特定對(duì)象
function add(c, d) {
  return this.a + this.b + c + d;
}

var o = {a: 1, b: 3};

add.call(o, 5, 7); // 16

add.apply(o, [10, 20]); // 34

// 常用的例子
function bar() {
  console.log(Object.prototype.toString.call(this));
}

bar.call(7);     // [object Number]
bar.call("foo"); // [object String]
通過(guò) bind 方法來(lái)綁定this
function fn() {
    return this.a;
}

let k = fn.bind(null);
k(); // undefined
//此時(shí)this === window

let g = fn.bind({a: 1});
g(); // 1

let m = fn.bind({a: 2});
m(); // 2

let h = g.bind({a: 3}); // bind只會(huì)綁定一次
h(); // 1

// 正常返回值
let obj = {
    a: 1,
    say: (function() {
        let _say = function() {
            console.log(this.a);
        }
        return _say;
    })()
}
obj.say(); // 1

// bind obj
var obj = {
    say: (function() {
        let _say = function() {
            console.log(this === window);
        }
        return _say.bind(obj);
    })()
}
obj.say(); // true



// bind的簡(jiǎn)單實(shí)現(xiàn)
Function.prototype.myBind = function(context){
  self = this;  //保存this,即調(diào)用bind方法的目標(biāo)函數(shù)
  return function(){
      return self.apply(context,arguments);
  };
};

let g1 = fn.myBind({a: 1})
g1(); // 1
let h1 = g1.myBind({a: 3})
h1(); // 報(bào)錯(cuò),
原理
this指的是函數(shù)運(yùn)行時(shí)所在的環(huán)境,執(zhí)行上下文
JavaScript 將對(duì)象存儲(chǔ)在內(nèi)存中,會(huì)將存儲(chǔ)的地址賦給我們所申明的變量;
var o = {a: 5};
//內(nèi)存中會(huì)這樣存儲(chǔ) o => a => {
//  foo: {
//    [[value]]: 5
//    [[writable]]: true
//    [[enumerable]]: true
//    [[configurable]]: true
//  }
//}

var f = function () {}
var m = {a: f} 
// 當(dāng)a的值是一個(gè)函數(shù)的時(shí)候,就會(huì)變成以下形式:
//內(nèi)存中會(huì)這樣存儲(chǔ) o => a => {
//  foo: {
//    [[value]]: f的地址
//    [[writable]]: true
//    [[enumerable]]: true
//    [[configurable]]: true
//  }
//}
this的作用
由上面可以看出,由于函數(shù)多帶帶存儲(chǔ),可以多帶帶運(yùn)行,運(yùn)行在不同的上下文中。但要有一個(gè)機(jī)制來(lái)表示它,this就是這個(gè)作用,能夠指向當(dāng)前函數(shù)的運(yùn)行環(huán)境;
箭頭函數(shù)原理的思考
箭頭函數(shù)又和上文說(shuō)的內(nèi)容不相符。其實(shí)仔細(xì)想想,它是個(gè)語(yǔ)法糖,等同于給函數(shù)運(yùn)用了bind方法,綁定函數(shù)的父作用域執(zhí)行環(huán)境
let str = "windows"
let o = {
    str: "o",
    methods: {
        str: "methods",
        fn: function () { console.log(this.str) },
           arrowFn: () => { console.log(this.str) } 
    }
}

let str = "windows"
let o = {
    str: "o",
    methods: {
        str: "methods",
        fn: function () { console.log(this.str) },
           arrowFn: function() {
          let fn = () => { console.log(this.str) } 
          return fn;
           }
    }
}

o.methods.fn(); // methods
o.methods.arrowFn()(); // methods; 注意區(qū)分上面的立即執(zhí)行函數(shù)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102893.html

相關(guān)文章

  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類(lèi)繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)?lái)幫助....(據(jù)說(shuō)是阿里的前端妹子寫(xiě)的) this 的值到底...

    blair 評(píng)論0 收藏0
  • javascript技術(shù)難點(diǎn)(三)之this、new、apply和call詳解

    摘要:第四點(diǎn)也要著重講下,記住構(gòu)造函數(shù)被操作,要讓正常作用最好不能在構(gòu)造函數(shù)里 4) this、new、call和apply的相關(guān)問(wèn)題 講解this指針的原理是個(gè)很復(fù)雜的問(wèn)題,如果我們從javascript里this的實(shí)現(xiàn)機(jī)制來(lái)說(shuō)明this,很多朋友可能會(huì)越來(lái)越糊涂,因此本篇打算換一個(gè)思路從應(yīng)用的角度來(lái)講解this指針,從這個(gè)角度理解this指針更加有現(xiàn)實(shí)意義。 下面我們看看在ja...

    ghnor 評(píng)論0 收藏0
  • JavaScript進(jìn)階之’this

    摘要:所以相同點(diǎn)是,在全局范圍內(nèi),全局變量終究是屬于老大的。只生效一次引入了。只生效一次在箭頭函數(shù)中,與封閉詞法環(huán)境的保持一致。我通常把這些原始函數(shù)叫做構(gòu)造函數(shù)。在里面你可以嵌套函數(shù),也就是你可以在函數(shù)里面定義函數(shù)。 showImg(https://img-blog.csdnimg.cn/20190522000008399.jpg?x-oss-process=image/watermark,...

    shenhualong 評(píng)論0 收藏0
  • Javascript 深入淺出This

    摘要:中函數(shù)的調(diào)用有以下幾種方式作為對(duì)象方法調(diào)用,作為函數(shù)調(diào)用,作為構(gòu)造函數(shù)調(diào)用,和使用或調(diào)用。作為構(gòu)造函數(shù)調(diào)用中的構(gòu)造函數(shù)也很特殊,構(gòu)造函數(shù),其實(shí)就是通過(guò)這個(gè)函數(shù)生成一個(gè)新對(duì)象,這時(shí)候的就會(huì)指向這個(gè)新對(duì)象如果不使用調(diào)用,則和普通函數(shù)一樣。 this 是 JavaScript 比較特殊的關(guān)鍵字,本文將深入淺出的分析其在不同情況下的含義,可以這樣說(shuō),正確掌握了 JavaScript 中的 th...

    Y3G 評(píng)論0 收藏0
  • 學(xué)習(xí)React之前你需要知道JavaScript基礎(chǔ)知識(shí)

    摘要:和類(lèi)在開(kāi)始時(shí)遇到類(lèi)組件,只是需要有關(guān)類(lèi)的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語(yǔ)法,但也包括三元運(yùn)算符,語(yǔ)言中的簡(jiǎn)寫(xiě)版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...

    bitkylin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<