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
        }; 
  });
  });