解释John Resig的一些忍者代码

时间:2009-10-01 23:48:35

标签: javascript

Function.prototype.bind = function(){
     var fn = this, args = Array.prototype.slice.call(arguments),
      object = args.shift();
      return function(){
              return fn.apply(object,
                   args.concat(Array.prototype.slice.call(arguments)));
      };
};


var myObject = {};
function myFunction(){
    return this == myObject;
}
assert( !myFunction(), "Context is not set yet" );
var aFunction = myFunction.bind(myObject)
assert( aFunction(), "Context is set properly" );

下面对Jeffery代码的微小修改帮助我理解了内部匿名函数中使用的参数。我只是改变了下面的3行

var introduce = function(greeting) { alert(greeting + ", my name is " + this.name + " ,home no is " + arguments[1]); }

hiBob(" 456"); // alerts "Hi, my name is Bob"
yoJoe(" 876");  

谢谢大家

5 个答案:

答案 0 :(得分:8)

arguments对象是一个类似于数组的对象,它只有length属性。

通过Array.prototype调用slice函数是将其转换为数组的常用技术,因此您可以直接在此示例中使用shiftconcat等数组函数。

答案 1 :(得分:6)

Array.prototype.slice.call(arguments)创建一个Array,其中包含传递给函数的所有参数。

答案 2 :(得分:6)

此代码在名为Function的{​​{1}}类型上创建一个新方法,该方法接受一个自由函数作为输入,并返回一个包装函数,该函数调用它就好像它是指定对象上的方法一样。这与.Net委托如何将函数及其关联的bind引用包装在一起非常相似。

此外,如果向this提供了多个参数,则这些附加参数将被添加到调用之前 - 此技术也称为currying

为了尝试以更简单的方式解释它,请考虑以下事项:

bind

答案 3 :(得分:1)

要回答你的问题,这就是切片的作用

  

Array.slice(begin[,end])切片   method从a创建一个新数组   选定的数组部分。该   原始数组不受此影响   但是,如果一个字符串或数字   数组被改变,它没有被反映出来   在另一方面,而改变为   引用的对象可以在两者中看到   数组对象。切片方法使用   从零开始的数组索引   确定哪个部分   创建新数组。它提取出来   到'但不包括''结束'   element(如果没有指定'end',则为   默认是最后一个元素)。该   以下代码创建一个名为的数组   '树'然后显示'切片'   它:代码:

trees = ["oak", "ash", "beech", "maple", "sycamore"] 
document.write(trees.slice(1,4)) 
     

输出:灰,山毛榉,枫树如果你   使用负面指数'结束',   这指定了一个如此多的元素   从最后的地方。继续   上面的例子,下面的代码   将通过显示第二个   阵列的倒数第三个元素:
  代码:

trees = ["oak", "ash", "beech", "maple", "sycamore"] 
document.write(trees.slice(1,-2)) 
     

产量:灰,山毛榉

至于给出当前上下文的切片,CMS有正确的答案

答案 4 :(得分:-1)

它将arguments对象转换为Array对象,以便他可以调用args.shift()

arguments对象是一个类似于数组的对象,它有0个或更多数字索引属性和length属性