Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中传递this指针的最佳方式是什么?_Javascript - Fatal编程技术网

在JavaScript中传递this指针的最佳方式是什么?

在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

假设我有两个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 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的
$代理(此…)
感谢您的回复!请你详细说明最后一部分好吗?“如果对象引用与它们不一致”是什么意思?