arguments对象、apply()、匿名函数

在学习arguments对象时,碰到的一段code,不是太好理解。原文地址中文(http://www.jb51.net/article/25048.htm)、英文(http://www.sitepoint.com/arguments-a-javascript-oddity/)

想要正确理解,需要把握红色标注的地方。

1,function.prototype.apply()用法

2.需要明白majorTom在这里指向了匿名函数function(){return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));}

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script>
        function format(string) {
            var args = arguments;
            var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
            return String(string).replace(pattern, function(match, index) {
                return args[index];
            });
        }
        function makeFunc() {
            var args = Array.prototype.slice.call(arguments);
            var func = args.shift();
            return function () {
                return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
            };
        }

        var majorTom = makeFunc(format, "This is Major Tom to ground control. I‘m %1.");
       console.log(majorTom("stepping through the door")) ;//majorTom是匿名函数的引用】

    </script>
</head>
<body>

</body>
</html>
时间: 2024-12-25 20:50:09

arguments对象、apply()、匿名函数的相关文章

Function 对象 &amp; anonymous 匿名函数

functionName = new Function( [argname1, [... argnameN,]] body ); 例子: var say = new Function("name","return name"); console.dir(say); console.dir(say("Lily")); 打印结果: function anonymous(name /**/) { return name } Lily 不论参数还是方法都

js匿名函数闭包

函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functionName = function(arg0,arg1){ //函数体 } 函数声明和函数表达式之间的主要区别是前者会在代码执行前被加载到作用域中,而后者是在代码执行到那一行的时候才会有定义.另一个区别是函数声明会给函数指定一个名字,而函数表达式则创建一个匿名函数,然后将这个函数赋给一个变量 1 递归 递归函数是在一个函数通过名字调用自身的情况下构成的,例如: fun

js之匿名函数

js之匿名函数   这篇博文内容来自于javascript高级程序设计第2版,向作者致敬 函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functionName = function(arg0,arg1){ //函数体 } 函数声明和函数表达式之间的主要区别是前者会在代码执行前被加载到作用域中,而后者是在代码执行到那一行的时候才会有定义.另一个区别是函数声明会给函数指定一个名字,而函数表达式则创建一个匿名函数,然后将这个函数

js闭包中的this(匿名函数中的this指向的是windows)

1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样 2.让匿名函数中的this指向对象的两种方法 可以使用对象冒充强制改变this:call().apply()        将this赋值给一个变量,闭包可以访问这个变量 一.this问题 匿名函数的执行环境具有全局性,因此其this对象通常指向window(当然,在通过call()或者apply()改变函数执行环境的情况下,this就会指向其他对象) 为什么匿名函数没有取得其包含作用域(或外部作用

Effective JavaScript Item 23 永远不要修改arguments对象

本系列作为Effective JavaScript的读书笔记. arguments对象只是一个类似数组的对象,但是它并没有数组对象提供的方法,比如shift,push等.因此调用诸如:arguments.shift(),arguments.push()是错误的. 在Item 20和Item 21中,知道了函数对象上存在call和apply方法,那么是不是可以利用它们来让arguments也能够利用数组的方法呢: function callMethod(obj, method) { var shi

[Effective JavaScript 笔记]第23条:永远不要修改arguments对象

arguments对象并不是标准的Array类型的实例.arguments对象不能直接调用Array方法. arguments对象的救星call方法 使得arguments可以品尝到数组方法的美味,知道可以吃,下面就是怎么吃的问题了.不管怎么吃,先吃一口试试. function callMethod(obj,method){ var shift=[].shift; shift.call(arguments); shift.call(arguments); return obj[method].a

使用 arguments 对象

arguments 对象表示参数集合,它是一个伪类数组,拥有与数组相似的结构,可以通过数组下标的形式访问函数实参值,但是没有基础 Array 的原型方法. //函数没有定义形参,但是在函数体内通过 arguments 对象可以获取传递给该函数的每个实参值. function f () { //定义没有形参的函数 for(var i = 0; i < arguments.length; i++ ) { //循环读取函数的 arguments 对象 alert(arguments[i]); //显示

重学JavaScript之匿名函数

1. 什么是匿名函数? 匿名函数就是没有名字的函数,有时候也称为< 拉姆达函数>.匿名函数是一种强大的令人难以置信的工具.如下: function a(a1, a2, a3) { // 函数体 } ==其他函数表达式== var a = function(a1, a2, a3) { // 函数体 } 以上两个例子在逻辑上等价,其主要的区别是: 前者会在代码执行前被加载到作用域中,而后者则是在代码执行到那一行的时候才会有定义.另一个重要的区别就是:函数声明会给函数一个指定的名字,而函数表达式则是

js:匿名函数/闭包前奏

js里面”万物皆对象“,函数同理 三种定义方式 a.传统的如同C语言一样的定义方式:function abc(){code} b.少见的定义方式:var abc = new Function('参数','代码');  //由此可见我们的function是构造函数Function的对象实例,即函数也是对象 c.匿名函数定义:var abc = function(){...} //写一个匿名函数,并让一个变量称为它的引用 对于匿名函数有很多奇技淫巧: 1.若是我们平时用a,b方法定义函数,实际调用的

js理解参数-arguments对象

js理解参数-arguments对象: 1. ECMAScript函数的参数: ECMAScript函数的参数在内部是用一个数组来表示的,函数接收到的始终是这个数组,而不关心数组中包含多少个参数,也不在乎传进来的参数是什么数据类型. 在函数体内可以通过arguments对象来访问这个参数数组. 2. 关于命名参数的问题: ECMAScript函数中命名的参数只提供便利,但不是必需的.在ECMAScript中,解析器不会验证命名参数,而是通过访问arguments对象的length属性获得参数的个