用“ var that = this”理解Javascript范围

说我在对象中具有以下属性方法:


  onReady: function FlashUpload_onReady()

  {

     Alfresco.util.Ajax.jsonGet({

       url: Alfresco.constants.PROXY_URI + "org/app/classification",

       successCallback: {

         fn: function (o) {

           var classButtonMenu = [],

               menuLabel, that = this;


           var selectButtonClick = function (p_sType, p_aArgs, p_oItem) {

               var sText = p_oItem.cfg.getProperty("text");

               that.classificationSelectButton.set("label", sText);

           };


           for (var i in o.json.items) {

             classButtonMenu.push({

               text: o.json.items[i].classification,

               value: o.json.items[i].filename,

               onClick: {fn: selectButtonClick}

             });

           }


           this.classificationSelectButton = new YAHOO.widget.Button({

             id: this.id + "-appClassification",

             type: "menu",

             label: classButtonMenu[0].text,

             name: "appClassification",

             menu: classButtonMenu,

             container: this.id + "-appClassificationSection-div"

           });

         },

         scope: this

       },

       failureMessage: "Failed to retrieve classifications!"

     });

我花了一些猜测才能弄清楚在selectButtonClick我需要引用的函数中(that而不是this为了获得访问权)this.classificationSelectButton(否则就会出现undefined),但是我不确定为什么不能使用this。我最好的猜测是,new YAHOO.widget.Button一旦调用了构造函数,整个对象中任何被某种方式引用的属性都会失去作用域。


有人可以解释为什么我必须引用classificationSelectButton它var that = this而不是仅仅调用`this.classificationSelectButton'吗?


犯罪嫌疑人X
浏览 886回答 3
3回答

偶然的你

因为this根据其运行的上下文更改其值。在selectButtonClick函数内部,this将引用该函数的上下文,而不是外部上下文。因此,您需要this在外部上下文中给不同的名称,该名称可以在selectButtonClick函数内部被引用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript