为什么不能将`push`函数分配给变量?

时间:2019-06-18 02:36:22

标签: javascript

这是我第一个可以正常工作的示例:

const testObj = {
   func: (str)=> { console.log(str) }
}

const testVar = testObj.func;

testVar("Working"); //logs "Working"

但是,如果我使用push函数尝试相同的操作,则未定义。

const array = [];
const testVar = array.push;

console.log(testVar); // function push() { [native code]}

testVar("Should Be added"); // TypeError: undefined is not an object (evaluating 'testVar("Should Be added")')

这是为什么?

2 个答案:

答案 0 :(得分:1)

@Data @NoArgsConstructor @AllArgsConstructor @ToString public class RequestDTO { String type; String param; String requestId; String screenName; } 需要知道在调用时{"param":"a","type":"b","requestId":"c","screenName":"S - Name for ref"} 是什么,以便知道它要推送到什么内容—通常这就是您调用它的数组。如果将函数与数组分开,则会丢失该绑定,因为push是通过调用函数的方式设置的。您可以使用call()明确地将其放回去:

this

bind()

this

答案 1 :(得分:1)

制作var push = [].push时;
您引用了从数组类型中使用this的数组类型中的效用函数推送,因此当您制作此push('data')
它会给您Cannot convert undefined or null to object,因为其中的this现在是null|undefined 因此,如果您要进行这项工作,则必须像使用call,'apply'或bind

/* call example */
var a = []
var push = a.push;
push.call(a, 'first elm')

/* apply example */
var a = [];
var push = a.push;
push.apply(a, ['first elm']);

/* bind example */
// Note: Bind doesn't execute the function but 
// it returns a new function with new context on it
var a = [];
var push = a.push;
var aBindPush = push.bind(a);
push('first elm');