ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript工厂模式变量范围

2019-07-23 22:35:24  阅读:253  来源: 互联网

标签:scoping javascript factory-pattern


我正在按照教程显示工厂模式以在javascript中创建对象.下面的代码让我难以理解它的工作原理.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>6-2.htm</title>
</head>
<body>
<script type="text/javascript">
function createAddress(street, city, state, zip) {
  var obj = new Object();
  obj.street = street;
  obj.city = city;
  obj.state = state;
  obj.zip = zip;
  obj.showLabel = function() {
    //alert(this.street + "\n" + this.city + ", " + this.state + " " + this.zip);
    //var obj;
    alert(obj.street + "\n" + obj.city + ", " + obj.state + " " + obj.zip);
  };
  return obj;
};

var JohnAddr = createAddress("12 A St.", "Johnson City", "TN", 37614);
var JoeAddr = createAddress("10061 Bristol Park", "Pensacola", "FL", 32503);

JohnAddr.showLabel();
JoeAddr.showLabel();
</script>
</body>
</html>

第一条注释行对我来说似乎很合适(在showLabel函数中使用this关键字).我不确定在它的位置使用obj是如何工作的. obj必须在某处引用一个全局变量,因为在该函数中运行时没有定义obj,对吧?因为我制作了2个对象,在这种情况下不仅仅是运气都能很好地显示,所以obj内容的旧值被正确存储和引用.但怎么样?如果我取消注释第二个评论然后它打破了我理解为什么,现在我明确地告诉js我正在谈论一个局部变量而且没有.

解决方法:

欢迎来到封闭世界.你是正确的感觉到你的行为,就像它是一个全球但不是全球的.这就是闭包的行为方式.

基本上在javascript中,当函数返回时,并非所有局部变量都必须像Java或C那样被垃圾收集/释放.如果存在对该变量的引用,则该变量在定义它的函数范围内存活.

从技术上讲,机制是不同的,有些人试图以这种方式解释它,并最终混淆了许多其他人.对我来说,闭包是一种“私有”全局变量,就像全局变量一样,它们在函数中共享,但它们并未在全局范围内声明.就像你在遇到这个功能时所描述的那样.

这里有一些关于与javascript闭包相关的stackoverflow的其他答案,我认为值得一读:

Hidden Features of JavaScript?

Please explain the use of JavaScript closures in loops

或者你可以谷歌短语“javascript closure”来探索这个主题.

补充答案.

至于为什么这在你的代码中工作的解释(而不是* cough *试图纠正你的代码,这样即使它在未修正的版本中工作* cough * ;-):

Javascript有后期绑定.很晚,非常晚.这不仅在编译期间没有绑定,它甚至在运行时也没有绑定.它在执行时受到约束 – 也就是说,在调用函数之前,你无法知道它真正指向的是什么.调用者基本上可以决定它的值是什么,而不是使用它的函数.

一些时髦的javascript后期绑定动作:

function foo () {
    alert(this.bar);
}

var bar = "hello";
var obj = {
    foo : foo,
    bar : "hi"
};
var second_obj = {
    bar : "bye"
};

foo(); // says hello, 'this' refers to the global object and this.bar
       // refers to the global variable bar.

obj.foo(); // says hi, 'this' refers to the first thing before the last dot
           // ie, the object foo belongs to

// now this is where it gets weird, an object can borrow/steal methods of
// another object and have its 'this' re-bound to it

obj.foo.call(second_obj); // says bye because call and apply allows 'this'
                          // to be re-bound to a foreign object. In this case
                          // this refers to second_obj

在你的代码中,这方便地引用了调用函数作为其方法的对象,这就是为什么它工作的原因,即使你显然没有使用假设正确的构造函数语法.

标签:scoping,javascript,factory-pattern
来源: https://codeday.me/bug/20190723/1517387.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有