闭包中的Javascript实例化。如何使工厂和模型独立?

闭包中的Javascript实例化。如何使工厂和模型独立?,javascript,closures,Javascript,Closures,这是一个浏览器。Js代码示例非常简单 案例1: var settingsImportantPrefix={ 基本属性:1 }; var模型=函数(){ var self=这个; self.getA=函数(){ 返回settings.primitiveProperty; } }; var工厂=功能(设置){ 返回(功能(设置){ 返回新模型(); }(设置); } var测试=工厂(设置SimPortantPrefix); test.getA()它是不同的,因为有不同的作用域。当你调用一个函数时

这是一个浏览器。Js代码示例非常简单

案例1:

var settingsImportantPrefix={
基本属性:1
};
var模型=函数(){
var self=这个;
self.getA=函数(){
返回settings.primitiveProperty;
}
};
var工厂=功能(设置){
返回(功能(设置){
返回新模型();
}(设置);
}
var测试=工厂(设置SimPortantPrefix);

test.getA()它是不同的,因为有不同的作用域。当你调用一个函数时,它不会继承调用它的代码的作用域,而是在创建它时得到它的作用域

这可以更简单地表示出来;这将不起作用,因为变量
a
不在创建函数
show
的范围内:

function show() {
  console.log(a);
}

function caller() {
  var a = 1;
  show();
}
function caller() {
  var a;

  function show() {
    consle.log(a);
  }

  a = 1;
  show();
}
这是因为变量
a
在创建函数
show
的范围内:

function show() {
  console.log(a);
}

function caller() {
  var a = 1;
  show();
}
function caller() {
  var a;

  function show() {
    consle.log(a);
  }

  a = 1;
  show();
}
这也是可行的,因为变量
a
位于创建函数
show
的范围内,并且不需要位于调用函数的范围内:

function creator() {
  var a = 1;

  function show() {
    console.log(a);
  }

  return show;
}

var showFunc = creator();
showFunc();

这是不同的,因为有不同的作用域。当你调用一个函数时,它不会继承调用它的代码的作用域,而是在创建它时得到它的作用域

这可以更简单地表示出来;这将不起作用,因为变量
a
不在创建函数
show
的范围内:

function show() {
  console.log(a);
}

function caller() {
  var a = 1;
  show();
}
function caller() {
  var a;

  function show() {
    consle.log(a);
  }

  a = 1;
  show();
}
这是因为变量
a
在创建函数
show
的范围内:

function show() {
  console.log(a);
}

function caller() {
  var a = 1;
  show();
}
function caller() {
  var a;

  function show() {
    consle.log(a);
  }

  a = 1;
  show();
}
这也是可行的,因为变量
a
位于创建函数
show
的范围内,并且不需要位于调用函数的范围内:

function creator() {
  var a = 1;

  function show() {
    console.log(a);
  }

  return show;
}

var showFunc = creator();
showFunc();

首先-在第一种情况下,示例的输出是错误的-第一种情况会生成
1
,而不是您编写的
undefined

但是,尽管它们的输出相同,但两者之间存在差异。 函数内部使用的变量范围是在定义函数时确定的,而不是在使用函数时确定的


在第一种情况下-正在使用的设置对象是全局
设置
变量,而在第二种情况下-正在使用的
设置
变量是局部变量。但是,由于JavaScript中的对象是通过引用传递的,因此最终使用的是同一个变量(更改
设置的值。primitiveProperty
将在两种情况下更改输出。

首先-第一种情况下示例的输出错误-第一种情况下生成
1
,而不是编写时生成
未定义的

但是,尽管它们的输出相同,但两者之间存在差异。 函数内部使用的变量范围是在定义函数时确定的,而不是在使用函数时确定的


在第一种情况下-使用的设置对象是全局
设置
变量,而在第二种情况下-使用的
设置
变量是局部变量。但是,由于JavaScript中的对象是通过引用传递的,因此最终使用的是同一个变量(更改
设置的值。primitiveProperty
将在这两种情况下更改输出。

两种情况都有输入参数。我已更新了代码。确定后,两种情况都将生成1-第一种情况的输出不是
未定义的
两种情况都有输入参数。我已更新了代码。确定后,两种情况都将生成1-第一种情况的输出输出不是
undefined
这两个代码在浏览器中都可以正常工作(前提是首先包含包含
Model()
的文件,否则它是未定义的)。它在node.js中不能像您期望的那样工作(第一个示例输出未定义),因为在node.js中,每个文件都有自己的上下文(包装在闭包中)为什么闭包不创建自己的作用域来获取值?您是指node.js还是指浏览器?在浏览器的情况下,如果您看到的是您看到的内容,则是因为包含
Model()的文件
是在其余代码执行后包含的,因此当代码执行时,
模型
是未定义的。如果您指的是node.js,那是因为每个文件都是它自己单独的闭包,因此可以防止文件中的变量污染其他文件的范围。我已经澄清了工厂和模型的用法。现在任务是semms更清楚一点。啊。好吧。我现在明白了。对不起,我误解了/误读了这个问题。Guffa的回答是正确的:因为
设置
工厂的
闭包的一部分,而不是
模型的
闭包的一部分。我想你误解了闭包是什么。闭包和范围几乎是一样的。如果有一件事是错的对于作用域,它也超出了闭包。作用域类似于类,闭包类似于对象。闭包是作用域的实例。这两种代码在浏览器中都可以正常工作(前提是首先包含包含
Model()
的文件,否则它是未定义的)。它在node.js中的工作方式与您期望的不同(第一个示例输出未定义)因为在node.js中,每个文件都有自己的上下文(包装在闭包中),为什么闭包不创建自己的作用域来获取值?您是指node.js还是指浏览器?在浏览器中,如果您看到的是您看到的内容,则是因为包含
Model()的文件
是在其余代码执行后包含的,因此当代码执行时,
模型
是未定义的。如果您指的是node.js,那是因为每个文件都是它自己单独的闭包,因此可以防止文件中的变量污染其他文件的范围。我已经澄清了工厂和模型的用法。现在任务是semms更