上下文使用调用并在Javascript中应用?

Che*_*rry 70 javascript

伙计们可以在Javascript中使用任何一个解释上下文callapply方法吗?

为什么要使用callapply不是直接调用函数?

kev*_*nji 77

您使用callapply当您想要向this函数传递不同的值时.从本质上讲,这意味着您要执行一个函数,就好像它是特定对象的方法一样.两者之间的唯一区别是call期望参数用逗号分隔,同时apply期望数组中的参数.

Mozilla apply页面的一个例子,其中构造函数是链接的:

function Product(name, price) {
    this.name = name;
    this.price = price;

    if (price < 0)
        throw RangeError('Cannot create product "' + name + '" with a negative price');
    return this;
}

function Food(name, price) {
    Product.apply(this, arguments);
    this.category = 'food';
}
Food.prototype = new Product();

function Toy(name, price) {
    Product.apply(this, arguments);
    this.category = 'toy';
}
Toy.prototype = new Product();

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
Run Code Online (Sandbox Code Playgroud)

什么Product.apply(this, arguments)所做的是以下内容:Product构造被施加为在每个的功能FoodToy构造,并且每个这些对象实例的正与传递this.因此,每个FoodToy现在都有this.namethis.category属性.

  • @davids&@ adrianp:需要让Food和Toy继承Product.看看这个例子:http://jsfiddle.net/Shawn/xNEYf/我删除了`Toy.prototype = new Product();`但是留下了`Food.prototype = new Product();`in,所以现在Food继承自产品,但玩具没有.我还为Product的原型添加了一个方法,并从Food和Toy中调用它来使缺少继承更加明显(只需打开控制台并运行代码,Food可以调用继承自Product的方法,但Toy不能并抛出错误) . (6认同)
  • 只是关于提供的代码片段的问题,为什么Toy和Food的原型被Product对象取代? (5认同)

Tig*_*ine 21

只有在使用call或者apply您可以修改this函数内的上下文时.

与其他语言不同 - 在JavaScript this中不引用当前对象 - 而是引用执行上下文,并且可以由调用者设置.

如果使用new关键字调用函数this将正确引用新对象(在构造函数内).

但在所有其他情况下 - this除非通过调用显式设置,否则将引用全局对象


jfr*_*d00 10

.call()希望使用不同的this值执行函数时使用.它将this值设置为指定值,将参数设置为指定,然后调用该函数..call()执行函数和执行函数之间的区别是this函数执行时指针的值.当你正常执行函数时,javascript决定this指针将是什么(通常是全局上下文,window除非函数被调用为对象上的方法).使用时.call(),您可以准确指定要this设置的内容.

您可以使用.apply(),当你想传递给函数的参数是一个数组. .apply()也可以使函数以特定this值执行. .apply()最常用的是当你有一些来自其他来源的不确定数量的参数时.通常使用通过使用特殊局部变量arguments将一个函数调用的参数传递给另一个函数,该变量包含传递给当前函数的参数数组.

我找到了MDN引用页面.CALL().适用()有帮助.