当前位置: 首页 > 面试题库 >

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

喻增
2023-03-14
问题内容

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

  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’吗?


问题答案:

要了解的最重要的一点是,函数对象 没有固定的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)中,因为新定义的函数可以访问在其外部范围内定义的变量。



 类似资料:
  • 问题内容: 我已经阅读过Java的作用域链,但对我来说却没有任何意义,有人可以告诉我什么是作用域链,以及作用域与图形或什至是白痴都能理解的方式。我用谷歌搜索,但没有找到可理解的东西:( 问题答案: 要了解作用域链,您必须知道闭包是如何工作的。 当您嵌套函数时,会形成一个闭包,内部函数即使在其父函数已经执行后,也可以引用其外部封装函数中存在的变量。 JavaScript通过遍历范围链(从本地到全局)

  • 问题内容: 我正在学习语言,这些要点摘自的规范。 虽然我能理解分1-4,我很困惑的点和: 5. 在函数内部声明的常量或变量标识符的范围始于ConstSpec或VarSpec的末尾(对于简短变量声明为ShortVarDecl),并在最里面的包含块的末尾结束。 6. 在函数内部声明的类型标识符的范围始于TypeSpec中的标识符,并终止于最里面的包含块的末尾。 这是我用来了解Go范围的代码: 据此,我

  • 问题内容: 为什么使用lambda函数来获取值列表i = 4。在调用lambda期间,不存在封闭范围。函数f已经完成工作并返回了控制(变量i不存在)。 问题答案: Python使用闭包捕获对原始变量的引用。这些对象保留对名称的引用,可以通过该引用访问值。这意味着变量在完成后将继续存在。 您可以在lambda对象的元组中内省此闭包;函数具有相同的属性: 这也是列表中 所有 lambda 都引用val

  • 问题内容: 我想做这样的事情 正确的语法是什么?JavaScript可能吗? 所以是一个整数,如果它在这些值之间,请执行某些操作。 问题答案: 这是我想出的另一种方法: