2016-10-09 102 views
-1

我的印象是,我可以通过使用bind将参数传递给一个函数,然后调用这些参数,就好像它们已经正常传递一样。为什么我需要这样做:为什么bind看起来像数组一样呈现参数?

$(document).ready(function() { 
    var func = function(button) { 
    button[0].on('click', function() { 
     alert('Hello World.'); 
    }) 
    } 
    func.bind(null, [$('.button')])(); 
}); 

当好像我应该能够只是这样做:

$(document).ready(function() { 
    var func = function(button) { 
    button.on('click', function() { 
     alert('Hello World.'); 
    }) 
    } 
    func.bind(null, [$('.button')])(); 
}); 

例,治疗button参数作为一个数组:

$(document).ready(function() { 
 
    var func = function(button) { 
 
    button[0].on('click', function() { 
 
     alert('Hello World.'); 
 
    }) 
 
    } 
 
    func.bind(null, [$('.button')])(); 
 
});
html, body, div { 
 
    padding:0; 
 
    margin:0; 
 
    display:flex; 
 
    justify-content:center; 
 
} 
 

 
.button { 
 
    background-color:gray; 
 
    margin:50px; 
 
    padding:50px; 
 
    width:50%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<div class="button">Button</div>

+1

它将它视为一个数组,因为你绑定了一个数组。 –

回答

3

bind()用于将当前调用范围绑定到函数,以便即使从其他位置调用该函数,它也会知道该绑定范围中的局部变量。

您要找的是apply()

var func = function(button) { 
 
    button.on('click', function() { 
 
    console.log('hello world'); 
 
    }); 
 
} 
 

 
func.apply(this, [$('.button')]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button class="button">Click Me</button>

为了完整起见,有也是较为常用的一个call()功能。它不是参数数组,而是在初始范围参数后面使用参数列表。

func.call(this, $('.button')); 
+2

'.apply()'更好,但即使这样也没有太大意义,因为可以使用'.call()'来代替。不要忘记删除尾部的'()' –

+1

啊是的,我错过了后面的'()'。我最初建议使用'call()',但似乎OP想要传递一个参数数组,所以'apply()'是最正确的方法。 – Soviut

+0

我明白了,是的,如果OP已经有一个数组,那么'.apply()'是解决方案。 –

2

您正在使用.bind错误。你不应该给它的参数数组,你应该给自己的论点:

function print(x, y, z) { 
 
    console.log(x, y, z);  
 
} 
 

 
print12 = print.bind(null, 1, 2); 
 

 
print12(3); // 1, 2, 3

而且,Soviut提到的,如果你调用.bind(...)(),你可能想.apply()或改为.call()

+0

哦,如果我有一个动态数量的参数我想传递给函数呢?编辑:我看到,上面的答案显示我需要使用的是'apply' – curiosity5678

+0

@ curiosity5678使用类似['.apply(null,[arg1,arg2,arg3,...])'](https:/ /developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/apply) – Frxstrem

+0

@ curiosity5678如果你想用动态数量的参数调用'bind',你可以使用'Function.bind.apply(myFunction ,[thisValue,arg1,arg2/* ... * /])' – Oriol

相关问题