栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

有没有办法在JavaScript的函数调用中提供命名参数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有没有办法在JavaScript的函数调用中提供命名参数?

ES2015及更高版本

在ES2015中, 参数解构可用于模拟命名参数。这将要求调用者传递一个对象,但是如果您还使用默认参数,则可以避免函数内部的所有检查:

myFunction({ param1 : 70, param2 : 175});function myFunction({param1, param2}={}){  // ...function body...}// Or with defaults, function myFunc({  name = 'Default user',  age = 'N/A'}={}) {  // ...function body...}

ES5

有一种方法可以接近您想要的,但它基于[

Function.prototype.toString
ES5的输出,该输出在某种程度上取决于实现,因此它可能与跨浏览器不兼容。

想法是从函数的字符串表示形式解析参数名称,以便可以将对象的属性与相应的参数关联。

函数调用可能看起来像

func(a, b, {someArg: ..., someOtherArg: ...});

其中

a
b
是位置参数,最后一个参数是带有命名参数的对象。

例如:

var parameterfy = (function() {    var pattern = /function[^(]*(([^)]*))/;    return function(func) {        // fails horribly for parameterless functions ;)        var args = func.toString().match(pattern)[1].split(/,s*/);        return function() { var named_params = arguments[arguments.length - 1]; if (typeof named_params === 'object') {     var params = [].slice.call(arguments, 0, -1);     if (params.length < args.length) {         for (var i = params.length, l = args.length; i < l; i++) {  params.push(named_params[args[i]]);         }         return func.apply(this, params);     } } return func.apply(null, arguments);        };    };}());

您将其用作:

var foo = parameterfy(function(a, b, c) {    console.log('a is ' + a, ' | b is ' + b, ' | c is ' + c);     });foo(1, 2, 3); // a is 1  | b is 2  | c is 3foo(1, {b:2, c:3}); // a is 1  | b is 2  | c is 3foo(1, {c:3}); // a is 1  | b is undefined  | c is 3foo({a: 1, c:3}); // a is 1  | b is undefined  | c is 3

这种方法有一些 缺点 (已警告您!):

  • 如果最后一个参数是一个对象,则将其视为“命名参数对象”
  • 您将始终获得与在函数中定义的参数一样多的参数,但是其中一些参数可能具有值
    undefined
    (这与根本没有值不同)。这意味着您不能
    arguments.length
    用来测试已传递了多少个参数。

除了拥有创建包装器的函数外,您还可以拥有一个接受函数和各种值作为参数的函数,例如

call(func, a, b, {posArg: ... });

甚至扩展,

Function.prototype
以便您可以执行以下操作:

foo.execute(a, b, {posArg: ...});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415975.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号