Javascript dojo要求和范围
有人能解释一下为什么Javascript dojo要求和范围,javascript,dojo,Javascript,Dojo,有人能解释一下为什么drawSection被称为“this”值成为全局范围吗 在我丢失小部件之前,是否需要在这里使用require而不必将它保存在另一个变量中 define("my/TextBox", [ "dojo/_base/declare", "dijit/form/ValidationTextBox" ], function( declare, ValidationTextBox ) { function drawSection() { alert(this)
drawSection
被称为“this”值成为全局范围吗
在我丢失小部件之前,是否需要在这里使用require而不必将它保存在另一个变量中
define("my/TextBox", [
"dojo/_base/declare",
"dijit/form/ValidationTextBox"
], function(
declare, ValidationTextBox
) {
function drawSection() {
alert(this);
require(["dojo/dom-construct"], function(domConstruct) {
alert(this); // this = window
});
};
return declare([ValidationTextBox], {
postCreate: function() {
this.inherited(arguments);
drawSection.call(this)
}
});
});
只需使用
dojo/\u base/lang
hitch()
函数即可解决此问题
因为require([“dojo/dom构造”],function(domConstruct){….})中的函数是引用全局上下文的
因此,在当前上下文中使用lang.hitch
函数(使用this
),问题就解决了
这是一个
及以上工作片段:
define(“我的/文本框”[
“dojo/_base/lang”,
“dojo/_base/declare”,
“dijit/form/ValidationTextBox”
],函数(lang,
声明,验证文本框
) {
函数drawSection(){
警惕(这个);
require([“dojo/dom-construct”]、lang.hitch(此函数为domConstruct){
警报(此);//此=窗口
}));
};
返回declare([ValidationTextBox]{
后创建:函数(){
这是继承的(论点);
drawSection.调用(此)
}
});
});
要求([
“dojo/parser”,
“我的/文本框”,
“dojo/domReady!”
],功能(
解析器,
文本框
) {
//重要提示:扩展ValidationTextBox后解析文档
parser.parse();
});代码>
,
您需要像这样使用dojo/\u base/lang
lang.hitch
:
require(["dojo/dom-construct"], lang.hitch(this, function(domConstruct) {
alert(this); // this = window
}));
这是一个常见的关闭问题。
看
作为一个好的实践,我建议在小部件中使用drawSection
方法,并在顶部使用所需的dom构造(您总是需要它,正如您在post-create
中所说的那样,因此“按需”要求是多余的)
它接受调用者(require
)定义的范围,这是window
,正如ben所说,然后lang.hitch(this,function(){})
意味着执行this
中引用当前类的函数,换句话说,如果我们声明lang.hitch(window,function(){})
它将在窗口的范围内执行,而不是在类中执行。嘿@blu10如果解决方案有效,请将答案标记为已解决:)
define("my/TextBox", [
"dojo/_base/declare",
"dijit/form/ValidationTextBox",
"dojo/dom-construct"
], function(declare, ValidationTextBox, domConstruct) {
return declare([ValidationTextBox], {
postCreate: function() {
this.inherited(arguments);
this.drawSection()
},
drawSection: function() {
alert(this);
//domConstruct.whaever you want
};
});
});