Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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_Object_Parameters_Members - Fatal编程技术网

Javascript可变参数?

Javascript可变参数?,javascript,object,parameters,members,Javascript,Object,Parameters,Members,这只是一个关于javascript的技术问题。在javascript中,我小组的一名成员发现javascript对象创建有些奇怪。由于某些原因,对象中的参数已被视为成员,而没有将其分配给在对象的构造函数中创建的任何成员变量。参数也是可变的,如下面的代码块所示 下面的代码显示了我们正在进行的测试 function NamedItem(name) { name = 5; this.getName = function () { return name;

这只是一个关于javascript的技术问题。在javascript中,我小组的一名成员发现javascript对象创建有些奇怪。由于某些原因,对象中的参数已被视为成员,而没有将其分配给在对象的构造函数中创建的任何成员变量。参数也是可变的,如下面的代码块所示

下面的代码显示了我们正在进行的测试

function NamedItem(name)
{
    name = 5;

    this.getName = function ()
    {
        return name;
    }
}


document.write(namedItem.getName() + "\n");  //5
这合法吗?它危险吗?

那叫a。
嵌套函数可以从其父函数访问变量,并将变量的生命周期延长到父函数执行之外

它与对象无关。

这称为a。
嵌套函数可以从其父函数访问变量,并将变量的生命周期延长到父函数执行之外


它与对象无关。

只是想澄清一下,在你所做的事情中有一些潜在的愚蠢之处。让我解释几个原则

  • 如果将一个或多个变量声明为函数的参数,例如
    函数(arg1,arg2)
    ,就变量本身(而不是它们的值)而言,这与在函数顶部声明
    变量arg1基本相同变量arg2。系统会自动为您声明。即使您尝试重新声明它们,它们仍然可以处理传入的参数

  • 函数是对象。对象可以具有属性。因此,函数可以具有属性,例如
    this.getName=function()

  • 正如@SLaks所指出的,您正在
    getName
    方法的版本中创建一个闭包。闭包在创建时捕获其上方事物的状态。因此,如果创建时其作用域中有一个
    name
    变量,则它将有权访问其作用域中的该name变量。这在JavaScript中是一种非常正常的做法,您已经使用公共访问器函数(
    getName
    )创建了一个私有属性(
    name
    )。干得好

  • 我假设您正在使用
    new
    关键字创建
    NamedItem
    的实例,如下所示
    var item=newnameditem(“javascripter”)
    。另一种方法(使用的内存比您现在所做的要少)是添加
    getName()
    函数调用
    NamedItem
    的原型,如下所示。原型方法的缺点是,您可以轻松地直接访问
    \u name
    。JavaScript中没有传统意义上的私有属性,但有些人使用下划线前缀向人们表明他们是私有的,并且不要使用它们。这种方法(原型)比您的方法使用更少的内存,因为如果您创建多个
    NamedItem
    实例,它们都共享一个原型

  • 改用原型:

    function NamedItem(name) {
        this._name = name
    }
    
    NamedItem.prototype.getName = function() {
        return this._name
    }
    
    希望这能给你一些思考的东西


    J

    我只是想澄清一下,你所做的事情可能有一些愚蠢的地方。让我来解释一些原则

  • 如果将一个或多个变量声明为函数的参数,例如
    函数(arg1,arg2)
    ,则根据变量本身(而不是其值)本质上,这与在函数顶部声明
    var arg1;
    var arg2;
    是一样的。它们是自动为您声明的。即使您尝试重新声明它们,它们仍然可以使用传入的参数

  • 函数是对象。对象可以有属性。因此函数可以有属性,例如
    this.getName=function()

  • 正如@SLaks所指出的,您正在您的
    getName
    方法版本中创建一个闭包。闭包在创建时捕获其上方事物的状态。因此,如果创建时其作用域中存在
    name
    变量,则它将有权访问其作用域中的name变量。这是一种非常正常的做法n JavaScript,并且您已经使用公共访问器函数(
    getName
    )创建了一个私有属性(
    name
    ),做得很好

  • 我假设您正在使用
    new
    关键字创建
    NamedItem
    的实例,如下所示
    函数调用
    NamedItem
    的原型,如下所示。原型方法的缺点是,您可以轻松地直接访问
    \u name
    。JavaScript中没有传统意义上的私有属性,但有些人使用下划线前缀向人们表明他们是私有的,并且不要使用它们。这种方法(原型)比您的方法使用更少的内存,因为如果您创建多个
    NamedItem
    实例,它们都共享一个原型

  • 改用原型:

    function NamedItem(name) {
        this._name = name
    }
    
    NamedItem.prototype.getName = function() {
        return this._name
    }
    
    希望这能给你一些思考的东西


    J

    更像是用JavaScript编程的现实。更像是用JavaScript编程的现实。这给了你真正私有变量的好处。没有人可以从外部更改它。所以参数“name”可以作为一个成员,而不需要让成员保存“name”中的值,这很好吗?@Wes:它不是一个成员。它是Just被恰好是成员的函数捕获。如果
    return function(){return name;}
    如果不创建对象,您将获得相同的行为。这将为您带来真正私有变量的好处。没有人可以从外部更改它。因此,参数“name”可以作为成员而不创建成员来保存“name”中的值,这没关系吗?@Wes:它不是一个成员。它只是由碰巧发生在成为会员。如果你