Effective JavaScript Variable Scope Item 8-9 Globals and Locals

本系列作为Effective JavaScript的读书笔记。

Item 8:少用全局对象

重点:

  1. 全局对象能够带来便利,但是有经验的程序员都会视图避免它。因为它会带来潜在的命名冲突的风险
  2. 全局变量是维系不同模块之间的纽带,模块之间只能通过全局变量来访问对方提供的功能
  3. 能使用局部变量的时候,绝不要使用全局变量
  4. 在browser中,this关键字会指向全局的window对象
  5. 两种用来改变全局对象的方式,通过var关键字声明以及给全局对象设置属性(通过this关键字)
  6. 通过全局对象进行针对当前运行环境的特性检测(Feature Detection),比如在ES5中提供了一个JSON对象用来操作JSON数据,那么可以通过if(this.JSON)来判断当前运行环境是否支持JSON

总结:

  1. 避免声明全局变量
  2. 尽量使用局部变量
  3. 避免向全局对象中添加属性
  4. 利用全局变量来进行特性检测

Item 9:总是声明局部变量

重点:

  1. 隐式声明的全局变量比全局变量更加麻烦。比如:

function swap(a, i, j) {
    temp= a[i]; // global
    a[i]= a[j];
    a[j]= temp;
}

上述的temp就会被隐式地声明成一个全局变量。

  1. 使用lint工具来检测JavaScript代码中是否有隐式声明的全局变量

总结:

  1. 总是记得通过var关键字来声明局部变量
  2. 使用lint工具来确保没有隐式声明的全局变量
时间: 2024-08-01 16:59:57

Effective JavaScript Variable Scope Item 8-9 Globals and Locals的相关文章

Effective JavaScript Variable Scope Item 10 避免使用with

本系列作为Effective JavaScript的读书笔记. Item 9:避免使用with关键字 重点: 设计with关键字本来是为了让代码变简洁,但是却起到了相反的效果,比如: function f(x, y) { with (Math) { return min(round(x), sqrt(y)); // ambiguous references } } 以上的代码中,调用的min,round以及sqrt都是Math上的方法. 如果Math对象上没有以上指定的方法,那么会在with以外

Effective JavaScript String Encoding Item 7

本系列作为Effective JavaScript的读书笔记. 提起Unicode,也许许多程序员都会觉得这玩意很麻烦,可是本质上,Unicode并不复杂.世界上每种语言的每一个文字都被一个整形数值表示,范围是0到1114111,这个值在Unicode术语中被称为Code Point.在字符到整形数值的映射上,Unicode和其它编码方式诸如ASCII并没有区别. 但是,Unicode存在多种编码方式,而ASCII只有一种方式: 字符集 编码方式 ASCII ASCII Encoding, e.

Effective JavaScript Item 12 理解Variable Hoisting

本系列作为Effective JavaScript的读书笔记. JavaScript中并没有Block Scoping,只有Function Scoping. 因此如果在一个Block中定义了一个变量,那么这个变量相当于是被定义到了这个Block属于的Function中,比如: function isWinner(player, others) { var highest = 0; for (var i = 0, n = others.length; i < n; i++) { <span s

Effective JavaScript Item 25 使用bind方法来得到一个固定了this指向的方法

本系列作为Effective JavaScript的读书笔记. 当需要将方法抽取出来作为回调函数使用的时候,常常会因为this的指向不明而发生错误,比如: var buffer = { entries: [], add: function(s) { this.entries.push(s); }, concat: function() { return this.entries.join(""); } }; 如果想利用其中的add作为回调函数对一组数据进行添加: var source

Effective JavaScript Item 23 永远不要修改arguments对象

本系列作为Effective JavaScript的读书笔记. arguments对象只是一个类似数组的对象,但是它并没有数组对象提供的方法,比如shift,push等.因此调用诸如:arguments.shift(),arguments.push()是错误的. 在Item 20和Item 21中,知道了函数对象上存在call和apply方法,那么是不是可以利用它们来让arguments也能够利用数组的方法呢: function callMethod(obj, method) { var shi

Effective JavaScript Item 39 绝不要重用父类型中的属性名

本系列作为Effective JavaScript的读书笔记. 如果需要向Item 38中的Actor对象添加一个ID信息: function Actor(scene, x, y) { this.scene = scene; this.x = x; this.y = y; this.id = ++Actor.nextID; scene.register(this); } Actor.nextID = 0; 同时,也需要向Actor的子类型Alien中添加ID信息: function Alien(

Effective JavaScript Item 28 不要依赖函数的toString方法

本系列作为Effective JavaScript的读书笔记. 在JavaScript中,函数对象上存在一个toString方法,它能够方便地将函数的源代码转换返回成一个字符串对象. (function(x) { return x + 1; }).toString(); // "function (x) {\n return x + 1;\n}" toString方法不仅仅会让一些黑客找到攻击的方法,而且该方法也存在严重的限制. 首先,toString方法的实现方式并没有被ECMASc

Effective JavaScript Item 27 使用闭包而不是字符串来封装代码

本系列作为Effective JavaScript的读书笔记. 对于代码封装,在JavaScript中有两种方式可以办到.第一种就是使用function,第二种则是利用eval()函数,传入到该函数的字符串参数可以是一段代码. 当对使用哪种方式犹豫不决时,使用function.因为使用字符串的一个重要缺点是,传入的字符串并不是一个闭包,而function则可以代表一个闭包.关于闭包的特点,在Item 11中进行了描述. 下面是一段使用字符串来封装代码的例子: function repeat(n,

Effective JavaScript Item 13 使用即时调用的函数表达式(IIFE)来创建局部域

本系列作为Effective JavaScript的读书笔记. 所谓的即时调用的函数表达式,这个翻译也许不太准确,它对应的英文原文是Immediately Invoked Function Expression (IIFE).下文也使用IIFE来表达这一概念. 首先看一个程序: function wrapElements(a) { var result = [], i, n; for (i = 0, n = a.length; i < n; i++) { result[i] = function