亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“this”關鍵字在函數中是如何工作的?

“this”關鍵字在函數中是如何工作的?

慕勒3428872 2019-06-03 16:19:28
“this”關鍵字在函數中是如何工作的?我剛剛在JavaScript中遇到了一個有趣的情況。我有一個類,它的方法是使用對象-文字表示法定義幾個對象。在這些對象中,this指針正在使用。根據程序的行為,我推斷this指針指的是調用方法的類,而不是文本創建的對象。這似乎是武斷的,雖然這是我希望它的工作方式。這是定義的行為嗎?跨瀏覽器安全嗎?是否有任何理由解釋為什么它超出了“規范”的范圍(例如,它是某個更廣泛的設計決策/哲學的結果)?壓縮代碼示例:// inside class definition, itself an object literal, we have this function:onRender: function() {     this.menuItems = this.menuItems.concat([         {             text: 'Group by Module',             rptletdiv: this         },         {             text: 'Group by Status',             rptletdiv: this         }]);     // etc}
查看完整描述

3 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

從我的另一個崗位上吃人,這比你想知道的還要多這,這個.

在我開始之前,最重要的是記住Javascript,并且在沒有意義的時候重復一遍。JavaScript沒有類(ES6)class句法糖)。如果什么東西看起來像一個類,這是一個聰明的伎倆。JavaScript對象功能..(這并不是100%的精確性,函數只是對象,但有時將它們看作單獨的事物是有幫助的)

這個這,這個變量被附加到函數中。每當你調用一個函數,這,這個的值,這取決于調用函數的方式。這通常被稱為調用模式。

在javascript中有四種調用函數的方法。您可以將該函數作為方法,作為功能,作為構造器,與應用.

作為一種方法

方法是附加在對象上的函數

var foo = {};foo.someMethod = function(){
    alert(this);}

當作為方法調用時,這,這個將綁定到函數/方法所屬的對象。在本例中,這將綁定到foo。

作為A函數

如果您有獨立功能,則這,這個變量將綁定到“全局”對象,幾乎總是窗戶對象在瀏覽器的上下文中。

 var foo = function(){
    alert(this);
 }
 foo();

這可能就是你被絆倒的原因但不要難過。許多人認為這是一個糟糕的設計決策。由于回調是作為函數調用的,而不是作為方法調用的,這就是為什么您將看到似乎不一致的行為。

很多人通過做這樣的事情來解決這個問題

var foo = {};foo.someMethod = function (){
    var that=this;
    function bar(){
        alert(that);
    }}

定義一個變量那,那個指向這,這個..關閉(一個主題本身的)保持那,那個因此,如果您調用BAR作為回調,它仍然有一個引用。

注:在use strict模式如果用作函數,this不一定是全球性的。(是的)undefined).

作為一個建設者

還可以調用函數作為構造函數。基于您使用的命名約定(TestObject),這也是也許是你在做的事,也是你被絆倒的原因.

使用新關鍵字作為構造器調用函數。

function Foo(){
    this.confusing = 'hell yeah';}var myObject = new Foo();

當作為構造函數調用時,將創建一個新對象,并且這,這個會被綁在那個物體上。同樣,如果您有內部函數并將它們用作回調,則將它們作為函數調用,并且這,這個將被綁定到全局對象。使用這個=這個技巧/模式的變量。

有些人認為構造函數/新關鍵字是Java/傳統OOP程序員創建類似類的一種方法。

應用方法

最后,每個函數都有一個名為“Apply”的方法(是的,函數是Javascript中的對象)。應用程序可以讓您確定這,這個也允許您傳遞一個參數數組。這是一個無用的例子。

function foo(a,b){
    alert(a);
    alert(b);
    alert(this);}var args = ['ah','be'];foo.apply('omg',args);


查看完整回答
反對 回復 2019-06-03
?
MM們

TA貢獻1886條經驗 獲得超2個贊

這是定義的行為嗎?跨瀏覽器安全嗎?

是。而且是的。

有什么理由可以解釋為什么它是這樣的.

意義this很容易推斷出:

  1. 如果

    this

    在構造函數中使用,并使用

    new

    關鍵詞,

    this

    引用將要創建的對象。

    this

    即使在公開的方法中也會繼續意味著目標。
  2. 如果

    this

    在其他任何地方使用,包括嵌套的

    受保護

    函數,它引用全局范圍(在瀏覽器中是窗口對象)。

第二種情況顯然是設計缺陷,但是通過使用閉包可以很容易地解決這個問題。


查看完整回答
反對 回復 2019-06-03
  • 3 回答
  • 0 關注
  • 519 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號