说我在对象中具有以下属性方法:
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一旦调用了构造函数,整个对象中任何在某种程度上被引用的属性都会失去作用域。
selectButtonClick
that
this
this.classificationSelectButton
undefined
new YAHOO.widget.Button
有人可以解释为什么我必须引用classificationSelectButton它var that = this而不是仅仅调用`this.classificationSelectButton’吗?
classificationSelectButton
var that = this
要了解的最重要的一点是,函数对象 没有固定的this值 - this更改的值取决于函数的调用方式。我们说 _用一个特定的this值调用_一个函数-该this值是在调用时间而不是定义时间确定的。
someFunc()
window
call
apply
new
prototype
bind
使用var that = this;是一种this在函数 定义时 (而不是函数 执行时 ,this可以是什么,取决于函数调用方式)存储值的方法。此处的解决方案是将的外部值存储在新定义的函数的范围内的this变量(传统上称为that或self)中,因为新定义的函数可以访问在其外部范围内定义的变量。
var that = this;
self