在JavaScript中传递this指针的最佳方式是什么?
假设我有两个JavaScript函数,我想将在JavaScript中传递this指针的最佳方式是什么?,javascript,Javascript,假设我有两个JavaScript函数,我想将这个指针从一个传递到另一个。我知道两种方法(如下所示)。哪一个是最佳实践 选项1: function a() { b(this); } function b(elem) { alert(elem); } function a() { b.call(this); } function b() { alert(this); } 选项2: function a() { b(this); } function
这个
指针从一个传递到另一个。我知道两种方法(如下所示)。哪一个是最佳实践
选项1:
function a() {
b(this);
}
function b(elem) {
alert(elem);
}
function a() {
b.call(this);
}
function b() {
alert(this);
}
选项2:
function a() {
b(this);
}
function b(elem) {
alert(elem);
}
function a() {
b.call(this);
}
function b() {
alert(this);
}
这并不能回答问题,但更改前问题的标题是:
JavaScript中的function.call(this)和function(this)有什么区别?
使用
call
设置被调用函数的上下文(this
):
function foo() {
console.log(this);
}
foo(); // window
foo.call({}); // {}
使用非严格模式(在浏览器环境中)的默认上下文是上例中显示的窗口
非严格模式是默认模式。严格模式仅受某些浏览器支持
如果函数是对象的方法,则上下文是对象本身:
var obj = {
foo: function () {
console.log(this);
}
};
obj.foo(); // obj
obj.foo.call({}); // {}
我知道两种方法(如下所示)
如您所见,这两种方法都有效:-)
哪一个是最佳实践
视情况而定。哪个更适合您的代码结构
如果您正在编写非常面向对象的代码,并且这两个函数都是在一个邻域中编写的,在这个邻域中,您希望所有东西都是一个方法,并且this
关键字在任何地方都引用一个对象实例,那么您不应该破坏这一点
如果没有,为了简单起见,您应该选择选项#1。另外,您可能需要考虑其他的正式参数<代码> b>代码>——如果对象引用不与之匹配,则选项2可能更好。
一般来说,没有最佳实践,只是指导方针。这完全取决于你的编码方式。就我个人而言,我会使用第一种形式,它更面向功能,而不是面向对象,并且您避免了额外的操作—更改上下文对象—此外,您不会依赖上下文对象本身。这意味着,如果您需要在某个地方重用
b
,您没有时间更改它的上下文对象
我给你举个实际的例子。假设b
是一个函数,它将元素的样式设置为none
。我们称之为隐藏:
function hide(element) {
element.style.display = "none";
}
您可以像这样使用它:
hide(document.getElementById("foo"))
到目前为止还不错。但是,如果要隐藏列表中的所有元素,该怎么办
// this is used to have an array of element for the example,
// because NodeList are not Array
var slice = Function.call.bind(Array.prototype.slice);
var nodes = slice(document.getElementsByTagName("div"));
nodes.forEach(hide);
您只需通过hide
。这是因为传递给forEach
的回调称为传递数组的每个值作为第一个参数
但它还没有结束。假设您不想隐藏列表中的所有div,只想隐藏列表中包含文本“foo”的div
然后:
等等。如果您决定将函数的“主题”作为第一个参数传递,那么您可以真正利用JavaScript的函数编程方面和方法
在这里您可以找到ES5方法的文档,如和。标题的可能副本与您的问题不匹配。我应该如何命名标题?我愿意改变它。(假设堆栈溢出允许我编辑;我以前从未编辑过标题)。我更改了标题,希望能更好地反映我的要求。很抱歉给您带来不便。还有bind
和jQuery的$代理(此…)
感谢您的回复!请你详细说明最后一部分好吗?“如果对象引用与它们不一致”是什么意思?