这种是什么写法,为什么能避免变量名冲突?

2015-05-05 15:44:20 +08:00
 EXDestroyer

var spider = spider || {};

(function (JOINSSE){
//TODO a b here

spider.mainLogView = mainLogView;

})(spider);

3871 次点击
所在节点    JavaScript
15 条回复
jarlyyn
2015-05-05 15:50:43 +08:00
闭包。
变量作用域的问题。
bigfei
2015-05-05 16:20:35 +08:00
dorentus
2015-05-05 17:30:22 +08:00
我怎么感觉这代码还是有问题……

传入的参数名叫 JOINSSE,
但是里面引用的变量名是 spider,那么在函数里面找不到,往外找,最后还是会找到外面的某个 spider 而不是传入作为参数的那个 spider。
Gonster
2015-05-05 17:49:54 +08:00
@dorentus 第一行不是定义spider了吗
ZnZt
2015-05-05 17:56:21 +08:00
@Gonster 参数白传了..
Gonster
2015-05-05 17:59:27 +08:00
@ZnZt 白传了是什么概念。。。
yangmls
2015-05-05 18:06:21 +08:00
@Gonster 在闭包外部,spider 以引用的形式传入闭包,这个引用名是 JOINSSE,你可以直接使用 spider,js 的作用域会向外查找,但 JOINSSE 就白传了
Gonster
2015-05-05 18:18:58 +08:00
@yangmls 0 ,0 原来是这个意思。。。 我好像刚刚脑袋里自动纠正了这个。。
iyangyuan
2015-05-05 19:16:06 +08:00
js里只有两用作用域:一是全局作用域,即Global。二是由function定义的局部作用域,或者叫块级作用域,也可以理解为私有作用域。
EXDestroyer
2015-05-05 21:11:56 +08:00
@yangmls
@ZnZt
不是白传的,我没写出来而已
yangmls
2015-05-05 21:21:42 +08:00
@EXDestroyer 呃。。。那为什么还要直接操作 spider 对象?
EXDestroyer
2015-05-05 22:28:35 +08:00
@yangmls 我也不清楚,因为没接触过这种写法,但是项目里每个文件都是这个模板,每个里面都有传一个类似JOINSSE的参数,外面的spider全部是固定的
rokeyzki
2015-05-07 18:00:18 +08:00
@jarlyyn 这不是闭包

@bigfei “立即执行函数表达式”叫IIFE,不叫IFEE

@iyangyuan JS里不存在块级作用域,只有全局作用域与函数作用域两种,块级作用域与函数作用域是两种不同的概念
lalalanet
2015-05-08 14:14:12 +08:00
@EXDestroyer 这就是错的,唯一有用的就是第一句
banri
2015-05-24 00:26:38 +08:00
第一行是定义全局变量,这个spider若存在,则还是它,否则是一个空对象。

后面是一个立即执行的匿名函数,传入了一个spider的参数…变量名冲突是什么意思,没明白楼主想知道什么。。。我是半吊子

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188629

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX