87,915
社区成员
发帖
与我相关
我的任务
分享
var Bind = function(object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function() {
return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}
function add(){
var i, args = arguments, len = args.length, sum = 0;
for(i=0; i < len; i++){
sum += i;
}
return sum;
}
function curry(fn){
var args = [].slice.call(arguments, 1);
return function(){
var moreArgs = [].slice.apply(arguments)
return fn.apply(null, args.concat(moreArgs ));
}
}
var fn = curry(add, 1, 2, 3);//产生一个可以不用反复输入前三个参数的新函数
alert(fn(4,5,6));
<input type="button" id="x" />
<input type="button" id="y" />
<script type="text/javascript">
var Bind = function(object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function() {
return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}
var o = new Object()
o.f=function(){alert(this)};
document.getElementById("x").onclick=o.f;
document.getElementById("y").onclick=Bind(o,o.f);
</script>
<script type="text/javascript">
var Bind = function (object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function () {
return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}
//首先说下arguments
//对于每个函数它都有个隐形的参数,就是arguments,它是个数组
//例如
function a(p1) {
alert(arguments[0])
}
a(1)//输出1
function b(p1,p2){
alert(arguments[0] + ',' + arguments[1])
}
b(1,2)//输出(1,2)
//arguments 它的类型是Array,但它是个特殊的Array,它没有slice方法
//Array.prototype.slice.call(arguments)这句是扩张arguments,给它一个slice方法,
//然后调用刚刚扩张出来的slice(2)方法,取得函数function(object,fun) 第二个参数后面的所有参数。
//args.concat 这个是合并两个数组的意思,把args 和 arguments 合并起来
//return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
//这个的意思,就是把所有参数传入到 fun 这个数里面,所有的参数包括(之前的args,还有后面args.concat的)
//这个函数的作用域是Object(至于作用域和call,apply 可以搜索相关资料)
//最后举个例子,例如,有两个人,一个是645,男,一个是abc,女
var obj = {
name: '645',
sex:true,//男
say: function () {//自我介绍
if (this.sex) {
alert('Hi my name is ' + this.name + ' ,I am boy');
}
else {
alert('Hi my name is ' + this.name + ' ,I am girl');
}
}
};
obj.say(); //输出 'Hi my name is 645 I am boy'
//下面我换人了,但是没有加性别
var obj2 = {
name:'abc'
}
//把这些变更,绑定到say函数上
var fn = Bind(obj2, obj.say, false)//这个性别改成flase,为女,注意,false(性别女)也传入到函数里了,这里是关键
fn(); //输出 'Hi my name is abc I am girl'
//有说的不对的,望高人指正
</script>