我在其他地方看到这个脚本,它会检查每一个复选框:
[].forEach.call(document.querySelectorAll('input[type="checkBox"]'),function(el){ el.checked=true; } );
我知道如何使用forEach
:
[0,1,2].forEach(function(num){ console.log(num); }); //0 //1 //2
但是现在,这是[].那为什么它仍然工作?为什么我不能这样做呢?
document.querySelectorAll('input[type="checkBox"]').forEach(function(el){ el.checked=true; } );
解决方法
JavaScript具有一流的功能;也就是说,它们被视为对象,可以拥有自己的属性和方法.内置的
Function.call
方法将该函数的参数作为其第一个参数,其余的参数将传递给函数本身.除了作为访问(不太简洁,因此较少使用的)Array.prototype.forEach方法的方法之外,不使用数组[].
它基本上是重新绑定Array.forEach
用于不是数组的东西,在这种情况下是一个NodeList.如果NodeLists提供了一个forEach方法,那么它将相当于,你可以将它读为:
document.querySelectorAll('input[type="checkBox"]').forEach(function(el) { el.checked = true; });
所以,深入一点.调用将执行具有不同上下文的函数. forEach遍历上下文并调用它作为参数传递的函数.所以一个someFunc.call(thisArg,otherArg)将被执行,就好像它在thisArg的上下文中一样,像thisArg.someFunc(otherArg).这是最简单的例子:
function callMe(something) { return something + this; } callMe('Hello'); // Hellonull or Hello[object Window] or something callMe.call({},'World'); // World[object Object]
apply()
以相同的方式工作,但是您传递一个参数数组作为第二个参数.