gpt4 book ai didi

javascript - 调用私有(private)范围

转载 作者:行者123 更新时间:2023-11-30 13:14:52 26 4
gpt4 key购买 nike

我正在阅读一本略高于我水平的书。该书的作者展示了如何使用匿名函数创建私有(private)作用域。我了解私有(private)范围的概念,但是,我不明白它是如何实现的。我确实知道这些局部变量只能在当前范围内访问(这是作者的话),但我不确定如何调用/实现它。你能给我一个例子,说明如何使用下面的 var Tim = new Person();

在实际代码中使用它吗?

使用匿名函数创建私有(private)作用域:

var Person = function(){};

(function(){
var findById = function(){ /* ... */ };
Person.find = function(id){
if (typeof id == "integer")
return findById(id);
};
})();

我的理解

var Tim = new Person(); 

我会怎么称呼?我会尝试找到 Tim 的 ID 吗?

最佳答案

首先:您提供的代码段不会返回 id,但会在传递 id 时返回一些内容。我必须承认,就私有(private)范围而言,这个例子并不是最好的例子。我会给你一个更详细的,但我希望更清楚的例子:

(function ()
{
var personObjects = [];
var findById = function(id)
{
return personObjects[id];
}
var Person = function (name)
{
this.id = personObjects.length;//first available index ~= auto increment
this.name = name;
personObjects.push(this);
};
Person.find = function(id)
{
//I woudl do: id = +id;, but sticking to your example
if (typeof id === 'number')
{
return findById(id);
}
return undefined;
}
window.Person = Person;//expose to global object
})();

那么,我们这里有什么。你说你了解作用域,所以我假设你知道这里声明的所有变量都将在包装函数返回后存活,但它们只对在同一作用域中声明的函数可见.如果不存在:personObjects 数组和 findById 函数对象将仍然存在,但只能由公开的 Person 构造函数访问(因为也分配了)全局对象。

每当实例化人物对象时,我都使用数组的长度来确定下一个可用的 ID,从而为每个对象创建一个唯一的 ID。当您向函数 findById 传递一个有效的 id(数组键)时,它只返回对其中一个对象的引用。 Person.find 方法调用这个封闭的函数,但在调用之前对参数进行一些检查。在某些非常特殊的情况下,这可能有助于调试,或在长原型(prototype)链中使用通用的 setter 和 getter。这就是为什么,至少对我来说,这个例子作为起点有点牵强。

无论如何,您可以像这样调用这个私有(private)方法 (findById):

var tim = new Person('tim');
Person.find(0);// returns a reference to tim
//or even
var tom = new Person('Tom');
tim.find(1);//returns tom
tom.find(0);//returns tim
tim.find(tom.id);//...

同样,据我所知,这种方法不太常见,为了练习/习惯作用域和闭包,我建议使用 setInterval 和事件委托(delegate)(例如:尝试创建你的移动设备上 tab 事件的自己的委托(delegate)人)。只需用谷歌搜索它们,您很快就会明白为什么这是一个很好的练习,但一开始有点令人生畏。

关于javascript - 调用私有(private)范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12376958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com