Apply抛出了一个无法读取null属性的错误

时间:2018-04-04 17:14:35

标签: javascript ecmascript-5

在jstree插件中有一个这样的函数:

this.check_node = function (obj, e) {
    if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); }
    // Removed code for readability
};

因此对于check_node我必须传递一个参数列表,我必须传递的参数列表在一个数组中,所以我这样做:

scope.jstree(true).check_node(...scope.args['check_node']);

scope.args['check_node']包含我要传递给check_node的args列表,使用spread运算符执行此操作不会引发任何错误,但由于某种原因我无法使用ES6语法和我坚持使用ES5,所以我不得不使用apply代替:

scope.jstree(true).check_node.apply(null, scope.args['check_node']);

但这会引发以下错误:

TypeError: Cannot read property 'settings' of null

就在这一行:

if(this.settings.checkbox.tie_selection)

为什么在这种情况下应用抛出错误并且传播操作符不是?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

好吧,在您的ES5代码中,您明确传递了null thisArg,因此this在被调用函数中是null。这里不足为奇。

扩展运算符只是以一种方式扩展数组,例如,如果你自己传递了它的值。

答案 1 :(得分:0)

因为您通过传递this作为第一个参数,明确说出“在函数调用null期间生成null”。

您需要将您想要的值this作为第一个参数传递。

我不熟悉您的图书馆,但这样做会:

var obj = scope.jstree(true);
obj.check_node.apply(obj, scope.args['check_node']);

如果jstree返回scope,您可以避免变量:

scope.jstree(true).check_node.apply(scope, scope.args['check_node']);

答案 2 :(得分:0)

因为你要将check_node改为null。应用的第一个参数是对象/上下文,它应该对你调用的函数起作用。