【问题标题】:Benefits of using call keyword to call a function in JavascriptJavascript 中使用 call 关键字调用函数的好处
【发布时间】:2013-03-24 22:24:23
【问题描述】:

在 JavaScript 中,我们可以通过两种方式调用函数:

function f(message) { ... }
f.call(this, "test");

或者只是:

f("test")

除了我们可以在第一种情况下指定范围之外,使用这种语法比另一种语法还有其他优势吗?

【问题讨论】:

  • 我想您可以使用call 表单来执行对象的函数成员,其中this 绑定到另一个对象,同时仍在第一个对象的闭包内。可能有一些用处,但我从来没有这样做过。
  • call 甚至不是 JavaScript 中的关键字。

标签: javascript


【解决方案1】:

您可以根据需要传递this 对象。例如

[].slice.call("abcdef", 2) === ['c', 'd', 'e', 'f'];

var x = {hasOwnProperty:function() { return false; }, key:42};
x.hasOwnProperty('key'); // == false
{}.hasOwnProperty.call(x, 'key'); // true

你应该注意call不是关键字,而是Function.prototype的方法。

阅读:

【讨论】:

  • +1,但请注意,在 ES5 严格模式下,this 可以设置为任何值(包括null 和未定义),而不仅仅是一个对象。
【解决方案2】:

除了第一种情况我们可以指定作用域

您不能“指定范围”。范围由代码的编写方式设置,除了使用with 在有限范围内,您不能动态更改它。函数的 this 关键字与作用域无关,它总是在当前执行上下文中解析为局部变量。

【讨论】:

    【解决方案3】:

    您还可以将call(和apply)用于partial function application,这是当您创建一个函数,该函数使用一些预设参数调用另一个函数时。例如:

    // Basic add function
    function add(a, b) {
        return a + b;
    }
    
    // Function to create new adders with a preset 'a' argument
    function createAdder(a) {
        return function(b) {
            return add.call(null, a, b);
        }
    }
    
    // Let's create a function that always adds five to what's passed in
    var addFive = createAdder(5);
    
    // Now let's test it
    addFive(6); // 11 - it works!
    

    【讨论】:

    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2021-06-09
    • 2019-05-26
    • 2020-07-05
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多