Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.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 - Fatal编程技术网

为什么Javascript有特权函数

为什么Javascript有特权函数,javascript,Javascript,经过工作中的讨论,我仍然没有一个令人满意的答案,关于下面的问题,在其他编程语言中,我们都没有提到特权函数 var kid = function(name) { // Private var idol = "Paris Hilton"; // Privileged this.get_idol = function() { return idol; }; } 我能想到的唯一逻辑是,如果你让一个公共函数返回一个私有变量,那么这个函数就

经过工作中的讨论,我仍然没有一个令人满意的答案,关于下面的问题,在其他编程语言中,我们都没有提到特权函数

var kid = function(name)
{
    // Private
    var idol = "Paris Hilton";

    // Privileged
    this.get_idol = function()
    {
        return idol;
    };
}
我能想到的唯一逻辑是,如果你让一个公共函数返回一个私有变量,那么这个函数就“有特权”这样做(因为你不能直接调用它)

在php中我们也可以这样做,但我们不使用这个别致的名称,我也记不起使用这个术语的任何其他语言

你甚至可能会发现,如果你需要一个“特权”功能,你的整个方法都是错误的,因为如果你需要从外部访问它,为什么不直接公开它呢

另一方面,私有变量不能从外部更改,因此它将受到保护。但是展示在外面

最后,作为纯javascript的新手,这个术语有点让人困惑,imho只是一个花哨的名字,让人更困惑,因为在php中,它也会变得像javascript:

class kid
{
    // Private
    private idol = "Paris Hilton";

    // PUBLIC OR PRIVILEGED ? 
    public function get_idol()
    {
        echo $this->idol;
    }
}

它也有同样的功能,但只是一个公共方法。

我从未听说过特权函数;正确的术语是:在一个作用域中定义一个函数,该函数可以访问在其外部作用域中定义的变量。闭包可以在很多语言中使用(Javascript、Python、Lisp/Scheme都可以,Java也可以部分通过内部类实现,这些内部类可以到达闭包范围中的最终变量)


对象的成员变量(例如Java/Javascript中的this.foo或PHP中的this->foo)不同。

是的,该模式用于模拟私有属性和访问它们的公共方法

JavaScript实际上没有对象的公共/私有属性/函数。私有属性是构造函数中的一个局部变量,子函数可以访问它(javascript术语中的“闭包”)。然后,子函数的引用作为属性添加到对象中


我认为“特权功能”一词并不常用。我只在“面向对象的JavaScript”教程中见过它。

JavaScript没有特权或任何功能。它的所有函数都是闭包,而闭包就是在那里使用的,C#也有闭包和大多数函数语言

如果需要,可以使用该语言的密码,但密码中不会出现privileged一词

这个术语似乎来自于,但它只是将闭包概念简化为一个特定的使用案例,我想是面向对象编程类型


Javascript在设计方面可能比大多数OOP语言更强大,但您需要以开放的思维和理解功能概念来处理它。试图强迫它成为另一种OOP语言将是一个坏主意,也是一种耻辱。

您正确地推断其目的是使变量
idol
私有化。只能从外部读取,不能修改

但是PHP中的代码并不等价,因为JS
kid
是一个包含内容的函数。一个更常见的习语是:

var kid = function() { return {}; }();
这里的关键是现在kid是在函数中定义的对象,因此可以隐藏
kid
的所有私有状态,并且只有附加的公共方法可用

var kid = function(name)
{
    // Private
    var aVal = 1;

    // Privileged
    this.get_idol = function()
    {
        return aVal++;
    };
}


var myKid= new kid();

//returns:1
myKid.get_idol();

//returns: 2
myKid.get_idol();

//returns: 3
myKid.get_idol();
可能有人使用了privileged这个词,只是为了说明
var aVal=1即使在执行匿名函数后仍然存在,可以从
get\u idol
访问


我自己从来没有听说过“特权”这个词,实际上你应该寻找“闭包”和“匿名”功能,公共、私有和特权这三个术语不属于JS语言定义的一部分。正如其他地方提到的,Douglas Crockford推广了JS特权这个术语

关键是JavaScript支持信息隐藏

public与privileged的显著区别在于,当您将函数定义为原型的一部分时,该函数无法访问私有成员。例如:

kid.prototype.doSomething = function () {
    // Cannot access the idol property
};

我建议您阅读一下JS对OOP(基于原型)和闭包的理解。您的JS示例与
声明几乎没有关系。@deinan,发布的代码是用JavaScript模拟类的标准方式。我完全同意。Javascript是一种有趣的语言。在javascript中真正拥有“私有变量”的唯一方法是通过闭包。只有定义变量范围内的函数才能访问它。该功能/范围之外的任何内容都不起作用。我不相信javascript的设计考虑了面向对象的实践。这似乎更多的是事后诸葛亮。这应该是公认的答案。这是关于闭包和它们创建的作用域的,仅此而已。嗯,您的示例完全错误,它应该类似于
var counter=function(){var x=0;return function(){return++x;}}()谢谢你指出ECMA规范,实际上从未在那里看过,你也是对的:这个术语确实来自crockford的网站,可能也在其他网站上找到。所以最终没有特权这回事。。(感谢上帝!)是的,crockford有一个发明新术语的坏习惯。这一页: