JavaScript“arguments”是否包含“this”
Does JavaScript `arguments` contain `this`?
我正在尝试理解函数中JavaScript的arguments
隐式变量。一些教程删除了它的第0个元素,并说它包含this
,但其他一些教程没有删除第0个元件。我很困惑。
我写了这个代码示例,它表明arguments
不包含this
:
function aaa () {
console.log(arguments[0])
}
aaa(1,2,3);
有时arguments
可能包含this
吗?我想知道为什么有些教程在使用arguments
之前会去掉第0个元素。
很可能您有一个类似blah(x)
的函数。在这种情况下,您去掉了第一个参数,因为它已经被捕获为变量x
,并且您想要传入的其余参数。
第一个参数不是this
。
Arguments是传递到函数中的原始参数的数组*,与"this"变量没有直接关系。
也就是说,不同的教程可能会尝试使用函数的scope(scope=>"this"变量)来解释函数引用是如何工作的,等等。这很容易涉及到传递一个数组并转移第一个参数。
考虑一下这个简单的片段:
var sample = function(a,b,c){
console.log(arguments, this);
};
sample(1,2,3);
输出:
[1,2,3],窗口
正如我们现在所知,"this"是一个特殊的变量,它与函数的范围有关。有很多文章描述了它的作用/工作方式,但具体来说,在这种情况下,你可能已经看到了以.call或.apply:的方式使用的东西
sample.call(sample, 1, 2, 3)
或
sample.apply(sample, [1,2,3])
这两个代码段都做同样的事情——它们将函数的"this"范围从窗口对象(因为"sample"被声明为全局函数)转换为"sample"函数本身,并传递参数1、2和3。他们输出:
[1,2,3],[样本函数]
在这种情况下,一些教程会放弃第一个参数的原因是,当范围发生变化时,通常会有"helper"函数使其更加明显,而且这些helper函数很多时候都将执行新函数的范围作为第一个参数。因此,他们去掉了第一个参数,并在(本质上)调用apply时使用它。一个常见的例子是bind(),如下所示:
Function.prototype.bind = function(scope){
var me = this,
args = Array.prototype.slice.apply(arguments, [1]);
return function () {
var handlerArgs = [];
for (i = 0; i < args.length; i++) {
handlerArgs.push(args[i]);
}
for (var i = 0; i < arguments.length; i++) {
handlerArgs.push(arguments[i]);
}
me.apply(scope, handlerArgs);
};
};
现在,您可以拨打:
var bound = sample.bind(sample, 1);
bound(2,3);
并得到输出:
[1,2,3][sample function]
您可以看到,当我们最初绑定函数时,我们正在传递一些参数(scope和第一个参数),在这一点上,我们将第一个参数("sample",因为这是"scope",必须与任何其他参数不同地处理)切片,然后,当调用bound()时,将1以及2和3推入最终参数列表。
一开始有点令人困惑,但希望这能有所帮助。
*技术上类似数组。
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- $(this).prop('property') vs. this.property
- 货币代码为欧元-金额的格式不应包含小数
- 如何包含特定于每个视图angularjs的javascript文件
- 我如何修复包含在captcha的addthis中的错误
- 正在注入包含JS的HTML
- Json数据包含日期和时间格式
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- Angular js-返回一个包含类似
- jQuery/JS包含运算符或类似运算符
- 如果href包含X,请更改href
- Jquery $this属性选择器是否包含单词
- this.context 在使用 React-router 时不包含路由器
- JavaScript“arguments”是否包含“this”
- Javascript“this”-引用包含对象
- 我如何将包含$(this)的函数应用于选择器的范围
- 使用jQuery 'this'使用包含多个元素的选择器
- 很奇怪;当$(this).width()被调用时,包含元素的大小会改变
- 当原型包含对象时,使用“this”值
- 绑定函数,包含"this"(JQuery)