`
Mossad
  • 浏览: 82239 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

arguments:JavaScript的一个怪老头

 
阅读更多
arguments是在每一个函数内都能够访问的、类似于数组的局部变量。它虽然很怪异,常常被忽略,但却是很多编码技巧(programming wizardry)的基础,所有主要的JavaScript库都对arguments的进行了深入的挖掘,每一个JavaScript程序员都应该熟练掌握它。

 

你可以在任何函数内访问到arguments,它以类似数组的形式保存了函数被调用时的参数,但它却不是一个真正的JavaScript数组,使用typeof arguments语句测试会返回:"object"。你可以通过数组下标的方式访问每一个参数值,它也像数组一样有一个length属性,但是它并不包含标准的数组方法,比如push、pop等。

 

创建灵活的函数

虽然它看上去用途有限,但arguments的确是一个很实用的对象。例如,你可以让函数接受不定量的参数。Dean Edwards的base2库中的format函数展示了这种灵活性。

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];
  });
};

你提供一个使用%1到%9充当占位符的模板字符串,然后再提供最多9个待替换的字符串参数,例如:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");

上面这行代码会返回字符串:“And the papers want to know whose shirt you wear”。

 

你可能注意到了一件事,在format函数的定义中我们只指定了一个参数:string。JavaScript允许我们传递任意数量的参数给一个函数,无论该函数如何定义,arguments对象都能够访问到它们。

 

转换成一个真正的数组

尽管arguments不是一个真正的JavaScript数组,但是我们可以使用Array的slice方法轻松地将它转换成一个真正的数组对象,就像这样:

var args = Array.prototype.slice.call(arguments);

 args变量现在是一个包含arguments全部数据的JavaScript数组对象。

 

创建包含预置参数的函数

我们可以使用arguments玩各种各样的技巧。下面是makeFunc函数的定义,makeFunc函数允许你提供一个函数的引用以及为这个引用函数准备的任意数量的参数,它会返回一个匿名函数,匿名函数会使用你预置的参数和匿名函数被调用时提供的参数来调用你指定的函数。

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)));
  };
}

提供给makeFunc的第一个参数会被认为是你希望调用函数的引用(当然,在这个简单的示例中我们没有添加校验),然后该函数引用会从arguments中被移除并保存到func中。然后makeFunc会返回一个匿名函数,匿名函数会使用Function对象的apply方法调用你指定的函数。

 

apply的第一个参数会指定被调用函数的作用域,也就是当函数被调用时,函数内部的this关键词所指向的对象。现在讲这个有点太高级了,所以我们给它赋null值就可以了。第二个参数是一组会被传递给func函数的arguments对象的值,makeFunc将预置的数组和匿名函数被调用时传进来的参数数组拼接在一起作为参数传递给被调用的函数func。

 

假设你需要输出一个模板固定的消息字符串。为了将你从每次调用format函数时都要引用模板字符串的重复工作中解救出来,你可以使用makeFunc这个函数工具来返回一个能够帮你自动填入模板参数并调用format函数的函数:

var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");

你可以重复使用majorTom函数:

majorTom("stepping through the door");
majorTom("floating in a most peculiar way");

每次你调用majorTom的时候,它都会去使用你提供的第一个参数和已填入的模板来调用format函数。上面的代码返回:

"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."

 

创建自引用的函数

你可能认为这很酷,别急,arguments还有一个惊喜等着你,它还有另外一个有用的属性:callee。arguments.callee包含了创建arguments对象的函数的引用。我们怎么使用这么个玩意儿呢?arguments.callee是匿名函数引用自身的一个简便方法。

 

repeat是一个函数,它包含一个函数引用和两个数字。第一个数字代表函数执行的次数,第二个数字代表每次执行前的延迟时间,单位是毫秒,repeat函数的定义如下:

function repeat(fn, times, delay) {
  return function() {
    if(times-- > 0) {
      fn.apply(null, arguments);
      var args = Array.prototype.slice.call(arguments);
      var self = arguments.callee;
      setTimeout(function(){self.apply(null,args)}, delay);
    }
  };
}

repeat使用arguments.callee来获取匿名函数的引用并将它保存在self变量中,这样匿名函数就能够通过setTimeout在一段时间的延迟后调用自己。

 

我的项目里有这么一个简单的函数,它接受一个字符串作为参数,然后弹出一个包含该字符串的警告框:

function comms(s) {
  alert(s);
}

但是,我要创建一个它的特别版函数,让它能够重复执行三次,间隔时间是两秒,我可以用我的repeat函数这样做:

var somethingWrong = repeat(comms, 3, 2000);
somethingWrong("Can you hear me, major tom?");

调用somethingWrong函数的结果是重复弹出三次警告框,间隔时间是两秒。

 

arguments用的不多,有点怪怪滴,但却充满了惊喜,值得我们去了解和学习。

 

原文地址:arguments: A JavaScript Oddity

分享到:
评论

相关推荐

    解决python脚本中error: unrecognized arguments: True错误

    在Python编程中,`error: unrecognized arguments: True` 错误通常出现在命令行解析时,当你尝试传递一个未被脚本预期的参数时。这个错误表明你可能在调用Python脚本时,传入了一个程序无法识别的参数,例如在这个...

    ORA-00600: internal error code, arguments [4194]错误

    NULL 博文链接:https://gembler.iteye.com/blog/346242

    理解Javascript函数形式参数与arguments

    arguments还有一个特殊的行为,那就是它会将所有的实际参数都当作对象来看待,对于基本数据类型的实际参数则会转换为其对应的对象类型。这可以通过在函数内定义与形式参数同名的变量并赋值来判断。在say函数中,我们...

    即用即查JavaScript核心对象参考手册:JavaScript

    `Date`对象用于处理日期和时间,`new Date()`创建一个新实例,`getFullYear()`、`getMonth()`、`getDate()`获取年、月、日,`getTime()`返回自1970年以来的毫秒数,`setTime()`设置时间。 7. **正则表达式RegExp**...

    Pytest使用allure提示unrecognized arguments

    在使用Pytest集成Allure框架时,可能会遇到“unrecognized arguments: –alluredir=reports”的错误提示。这个问题通常与Python环境配置不正确有关,尤其是当系统中存在多个Python版本时。以下是对这个问题的深入...

    Arguments是进行函数调用.doc

    在JavaScript编程语言中,函数是核心的组成部分,而`Arguments`对象则是JavaScript函数的一个独特特性。这个对象在函数调用时被自动创建,用于存储所有传递给函数的实际参数,无论这些参数是否在函数声明中定义。`...

    JS:arguments

    在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这一特性,使其成为开发人员在设计灵活、可...

    JavaScript

    - **外部引用**:如果多个HTML页面共享相同的JavaScript脚本,可以将这些脚本存储在一个单独的文件中,并通过`<script>`标签的`src`属性来引用。这种方式有利于代码复用和维护: ```html ...

    shift-arguments:移动 javascript 函数参数以更好地与不同框架集成

    移位参数 移动 javascript 函数参数以更好地与不同框架集成 npm install shift-arguments用法删除参数 var shiftArguments = require('shift-arguments');function testFunc (result) {}function doSthAsync ...

    JavaScript_一个脚本的集合,描述了编程语言的奇怪特性.zip

    3. 基于原型的对象:JavaScript的对象继承是通过原型链来实现的,每个对象都有一个proto属性指向其构造函数的原型对象。 4. 弱引用:JavaScript具有弱引用机制,可以创建只持有对象引用而不阻止垃圾回收的引用。 5...

    Arguments:用于从联邦上诉法院的口头辩论中抓取和存储元数据的脚本

    Arguments 是一个 Python 脚本,用于从联邦上诉法院抓取和存储口头辩论元数据。 该脚本目前收集有关第一、第三、第四、第五、第六、第七、第八、第九、DC 和联邦电路中的参数的数据。 它提取指向争论录音和案件信息...

    水加热计算

    SYNTAX: IsNull(expression) ARGUMENTS: EXAMPLE: $#@60;% Dim i response.write IsNull(i) %> RESULT: False IsNumeric()  FUNCTION: 判断一对象是否为数字,返回布尔值. SYNTAX: IsNumeric(expression) ...

    arguments对象的使用

    在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,特别是在处理函数参数时。它不是一个真正的数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径。无论函数定义了多少个形式参数...

    basis-arguments:命令行解析库

    为什么要使用另一个参数解析器库? 没有魔术API(注释,反射等)。 部署到Maven Central。 零依赖性。 设置 作为您的Maven项目的依赖项: <groupId>io.marioslab.basis <artifactId>arguments <version>1.3 ...

    【JavaScript源代码】JavaScript中arguments的使用方法详解.docx

    JavaScript中的`arguments`对象是一个非常重要的特性,尤其在处理不确定数量的函数参数时。它不是一个真正的数组,但具有数组类似的行为,允许我们访问函数调用时传入的所有参数。在这个文档中,我们将深入探讨`...

    Passing arguments to Python functions

    在这个例子中,`a` 是一个位置参数,调用函数时需要提供一个值给 `a`。如果提供的参数数量与定义时的数量不符,则会引发错误。 **示例:** ```python # 正确的调用 nostar(1) # 错误的调用 nostar(1, 2, 3) # ...

    javascript核心教程

    10.闭包:闭包是JavaScript中一个高级概念,它允许函数访问并操作其外部作用域的变量,即使在其外部作用域已经结束的情况下。 11. 异步编程:JavaScript是单线程的,但通过异步编程(如回调函数、Promise、async/...

    JavaScript语言参考手册

    5. 函数:JavaScript支持函数表达式和函数声明,可以使用arguments对象获取传入的参数,还有箭头函数(=>)的简洁语法。 对象和数组: 1. 对象:JavaScript中的对象是键值对的集合,可以通过点号或方括号访问属性。...

    js-yaml:JavaScript YAML解析器和转储器。 非常快

    JS-YAML-适用于JavaScript的YAML 1.2解析器/编写器 ...Positional arguments: file File with YAML document(s) Optional arguments: -h, --help Show this help message and exit. -v, --version Sh

    javascript下利用arguments实现string.format函数

    sitepoint上看到Andrew Tetlaw在08年写的文章arguments: A JavaScript Oddity,阅读之后,除了对arguments温故知新一遍以外,印象最深刻的还是Andrew的第一个函数实现的string.format功能。

Global site tag (gtag.js) - Google Analytics