一尘不染

用“ var that = this”了解Javascript范围[重复]

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一旦调用了构造函数,整个对象中任何在某种程度上被引用的属性都会失去作用域。

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


阅读 266

收藏
2020-05-01

共1个答案

一尘不染

要了解的最重要的一点是,函数对象 没有固定的this - this更改的值取决于函数的调用方式。我们说
_用一个特定的this值调用_一个函数-该this值是在调用时间而不是定义时间确定的。

  • 如果该函数被称为“原始”函数(例如,do someFunc()),this则将是全局对象(window在浏览器中)(或者undefined该函数在严格模式下运行)。
  • 如果将其作为对象上的方法this调用,则将成为调用对象。
  • 如果你调用一个函数callapplythis被指定为第一个参数callapply
  • 如果将其称为事件侦听器(如此处所示),this它将是作为事件目标的元素。
  • 如果使用调用它作为构造函数newthis则将是一个新创建的对象,其原型设置为prototype构造函数的属性。
  • 如果函数是bind操作的结果,则该函数将始终永远this设置为产生该函数的bind调用的第一个参数。(这是唯一的例外的“函数不具有固定的this”规则-产生由功能bind实际上 有一个不可变this)。

使用var that = this;是一种this在函数 定义时 (而不是函数 执行时
this可以是什么,取决于函数调用方式)存储值的方法。此处的解决方案是将的外部值存储在新定义的函数的范围内的this变量(传统上称为thatself)中,因为新定义的函数可以访问在其外部范围内定义的变量。

2020-05-01