Javascript 在严格模式下使用此.inherited(参数)时出现DOJO错误

Javascript 在严格模式下使用此.inherited(参数)时出现DOJO错误,javascript,dojo,Javascript,Dojo,我正在为Dijit自定义小部件声明一个基本“类” 当处于“严格模式”例程时,此.inherited(参数);正在调用时,我收到以下错误: 未捕获的TypeError:“调用者”、“被调用者”和“参数”属性可能不正确 不能在严格模式函数或对象的参数上访问 打电话给他们 我需要保持“严格模式”的用法 你知道怎么解决吗 define([ 'dojo/_base/declare', 'dojo/topic', 'dojo/_base/lang' ], function (

我正在为Dijit自定义小部件声明一个基本“类”

当处于
“严格模式”
例程
时,此.inherited(参数)
;正在调用时,我收到以下错误:

未捕获的TypeError:“调用者”、“被调用者”和“参数”属性可能不正确 不能在严格模式函数或对象的参数上访问 打电话给他们

我需要保持“严格模式”的用法

你知道怎么解决吗

define([
    'dojo/_base/declare',
    'dojo/topic',
    'dojo/_base/lang'
], function (
    declare,
    topic,
    lang
    ) {
    'use strict';
    var attachTo = 'myPanels';
    return declare(null, {
        id: null,
        title: null,
        postCreate: function () {
            // ERROR HERE
            this.inherited(arguments);
            this.placeAt(attachTo);
        },
        constructor: function () {
        },
    });
});

注意:删除
'strict mode'
可以解决这个问题,但在我的例子中不是一个选项,因为我需要使用
'strict mode'
这是一个已知的问题,Dojo使用
参数。被调用方
用于内省和确定继承的(更准确地说是下一个)方法。要解决此问题,您需要创建自己的
参数
对象,然后指定
参数.被调用方
属性并将其传递给Dojo进行内省。唯一的一个问题是将函数传递给它自己,但它可以很容易地解决,例如,使用此帮助程序,将其放置在模块中,例如
override.js

“严格使用”;
定义([],函数(){
var slice=Array.prototype.slice;
返回函数(方法){
var代理;
/**@此目标对象*/
代理=函数(){
var me=这个;
var inherited=(this.getInherited&&this.getInherited({
//模拟空参数
被叫人:代理,
长度:0
}))| |函数(){};
返回方法.apply(me,[函数(){
返回继承的。应用(me、参数);
}].concat(slice.apply(参数));
};
proxy.method=方法;
proxy.overrides=true;
返回代理;
};
});
现在您可以使用它来调用继承的方法


从v1.13.0开始,这个问题在Dojo框架中得到了解决

假设您使用的是Dojo 1.13.0或更新版本,要调用从严格模式文件继承的
this,只需将调用函数的引用(使用命名函数表达式或NFE)作为第一个参数传递

因此,上面的代码如下所示:

define([
    'dojo/_base/declare',
    'dojo/topic',
    'dojo/_base/lang'
], function (
    declare,
    topic,
    lang
    ) {
    'use strict';
    var attachTo = 'myPanels';
    return declare(null, {
        id: null,
        title: null,
        postCreate: function postCreate() { //(1) add function name
            //(2) pass function reference as the first argument
            this.inherited(postCreate, arguments);
            this.placeAt(attachTo);
        },
        constructor: function () {
        },
    });
});

请注意,命名函数表达式(NFE)在IE8和早期版本中非常有缺陷,因此如果您支持这些浏览器,请不要使用它。

请注意,Dojo ShrinkSafe无法处理命名函数表达式。我的代码被破坏为
postreate:function postreate(){this.inherited(_17,arguments);…
,未定义
_17
。要修复它,我必须使用正常的函数声明(在“return”对象之外)。我认为最好使用闭包编译器(或者更好——修补Dojo构建以支持
更简洁的
,就像我在上一份工作中所做的那样)。
define([
    'dojo/_base/declare',
    'dojo/topic',
    'dojo/_base/lang'
], function (
    declare,
    topic,
    lang
    ) {
    'use strict';
    var attachTo = 'myPanels';
    return declare(null, {
        id: null,
        title: null,
        postCreate: function postCreate() { //(1) add function name
            //(2) pass function reference as the first argument
            this.inherited(postCreate, arguments);
            this.placeAt(attachTo);
        },
        constructor: function () {
        },
    });
});