可以覆盖参数吗?

时间:2013-07-31 08:25:28

标签: javascript

根据此mozilla document,可以设置arguments

arguments[1] = 'new value';

但我的jshint拒绝接受。可以设置参数吗?

这就是我现在要做的事情:

Handlebars.registerHelper('propPartial', function(property, options) {
    var name = Ember.Handlebars.get(this, property);
    // I have to do this because arguments[0] = name; does not work, contrary to what is stated here:
    //   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments
    var args = [], i, l;
    args.push(name);
    for (i = 1, l = arguments.length; i < l; i++) {
        args.push(arguments[i]);
    }
    return Ember.Handlebars.helpers.partial.apply(this, args);
});

更新,供参考

感谢@TJCrowder,这是工作代码,愚弄jshint

Handlebars.registerHelper('propPartial', function(property, options) {
    var name = Ember.Handlebars.get(this, property);
    var args = arguments;
    args[0] = name;
    return Ember.Handlebars.helpers.partial.apply(this, args);
});

2 个答案:

答案 0 :(得分:6)

是的,他们可以。您可以在JSLint遇到问题的JavaScript中执行批次

我不建议,但你可以做。

如果你真的想要这样做并通过jslint,你可以欺骗它:

var a = arguments;
a[1] = 'new value';

请注意,arguments与函数中任何命名参数之间的链接在松散模式下为 live 。 E.g:

function foo(a, b) {
    arguments[1] = "x"; // This line changes `b`
    console.log("a = " + a);
    console.log("b = " + b);
}

foo(1, 2);

输出

a = 1
b = x

严格模式下,他们不会保持联系:

function foo(a, b) {
    "use strict";

    arguments[1] = "x"; // This line does *not* change `b`
    console.log("a = " + a);
    console.log("b = " + b);
}

foo(1, 2);

输出

a = 1
b = 2

答案 1 :(得分:1)

是的,你能做到这一点。 JSLint只是检查代码是否适用于某些编码规则的工具。创建这些规则是为了激发编写好的JavaScript代码。

所以你可以使用它,但不建议,因为它被称为“坏”的javascript代码。

有关JSLint的更多信息:http://www.jslint.com/lint.html

我认为JSLint不允许这样做的原因是因为一般来说,程序员会期望arguments变量包含传递给函数的参数。如果你操纵它,你就改变了程序员的“现实”。

您可以更好地将其分配给另一个变量:

var my_argument = arguments[1] || 'fallback_value';
相关问题