Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在什么情况下,默认值需要是一个函数?_Javascript_Backbone.js - Fatal编程技术网

Javascript 在什么情况下,默认值需要是一个函数?

Javascript 在什么情况下,默认值需要是一个函数?,javascript,backbone.js,Javascript,Backbone.js,我从查看localtodos应用程序开始,可以看出这段代码使它成为一个函数。我不知道如何做出这个选择。我的假设是,在调用函数之前,函数中的代码不会运行,而对象文本将立即被解释 以下是用例: var FavoritesRow = Backbone.Model.extend({ Name: 'FavoritesRow', defaults: function () { return { url: "http://www.google.com",

我从查看
localtodos
应用程序开始,可以看出这段代码使它成为一个函数。我不知道如何做出这个选择。我的假设是,在调用函数之前,函数中的代码不会运行,而对象文本将立即被解释

以下是用例:

var FavoritesRow = Backbone.Model.extend({
    Name: 'FavoritesRow',
    defaults: function () {
        return {
            url: "http://www.google.com",
            title: "google",
            favicon: "http://www.google.com/favicon.ico",
            tag: "search"
        };
    }
});
但是我通常应该遵循什么规则呢?

来自:

记住,在JavaScript中,对象是通过引用传递的,所以如果 如果包含一个对象作为默认值,它将在所有用户之间共享 实例。相反,将默认值定义为函数

比较

var M = Backbone.Model.extend({
    defaults: {
        obj: {}
    }
});

var m1 = new M();
var m2 = new M();
console.log(m1.get('obj') === m2.get('obj'));
// ==> outputs true

使用函数可以定义默认数组或对象,而无需在类的所有实例上共享它们。

来自:

记住,在JavaScript中,对象是通过引用传递的,所以如果 如果包含一个对象作为默认值,它将在所有用户之间共享 实例。相反,将默认值定义为函数

比较

var M = Backbone.Model.extend({
    defaults: {
        obj: {}
    }
});

var m1 = new M();
var m2 = new M();
console.log(m1.get('obj') === m2.get('obj'));
// ==> outputs true


使用函数可以定义默认数组或对象,而无需在类的所有实例上共享这些数组或对象。

如果:

a) 您需要访问此实例
b) 在构建返回结果时,需要执行条件逻辑 c) 您不希望在所有实例之间共享对象(尽管下面有一个替代方案)

如果您确实使用了一个对象,并且不希望它在类范围内共享,那么您可以在
初始化
中创建一个对象,并将其设置为函数:

this.defaults = {} // Now it is instance-scope

请注意,使用
\uuu0.result
并不总是产生所需的
上下文。有时最好显式地传递上下文,例如
if(u.isFunction(this.x))this.x.call(this)
。在默认情况下
使用结果
,因此您可能需要检查上下文是否确实是模型实例。

如果:

a) 您需要访问此
实例
b) 在构建返回结果时,需要执行条件逻辑 c) 您不希望在所有实例之间共享对象(尽管下面有一个替代方案)

如果您确实使用了一个对象,并且不希望它在类范围内共享,那么您可以在
初始化
中创建一个对象,并将其设置为函数:

this.defaults = {} // Now it is instance-scope

请注意,使用
\uuu0.result
并不总是产生所需的
上下文。有时最好显式地传递上下文,例如
if(u.isFunction(this.x))this.x.call(this)
。如果是
默认值
\u0,则使用result
,因此您可能希望检查上下文是否确实是模型实例。

在所有实例之间共享,没有使用新值初始化,就像使用函数一样没有新值或旧值默认值只有一个值。我添加了一个示例,因此当默认值很复杂时,您只需要使用函数,即它们是引用类型。如果我所有的默认值都是原语,那么我就不需要了。因此,他的例子是有道理的。正确吗?在所有实例中共享,没有像使用函数那样使用新值初始化没有新值或旧值默认值只有一个值。我添加了一个示例,因此当默认值很复杂时,您只需要使用函数,即它们是引用类型。如果我所有的默认值都是原语,那么我就不需要了。因此,他的例子是有道理的。对的