JS编程建议——18:比较function语句和function表达式

建议18:比较function语句和function表达式
在JavaScript语言中,既有function语句,也有函数表达式,这是令人困惑的,因为它们看起来是相同的。一个function语句就是值为一个函数的var语句的简写形式。
下面的语句:

  1. function f() {}
    相当于:
  2. var f=function() {}
    这里建议使用第二种形式,因为它能明确表示f是一个包含一个函数值的变量。要用好JavaScript这门语言,理解函数就是数值是很重要的。

function语句在解析时会被提升,这意味着不管function被放置在哪里,它都会被移动到定义时所在作用域的顶层。这放宽了函数必须先声明后使用的要求,当然这也会造成混乱。
在if语句中也是禁止使用function语句的。大多数的浏览器都允许在if语句中使用function语句,但它们在解析function语句的处理上各不相同,因此造成了可移植性方面的问题。
根据官方的语法约定,一个语句不能够以一个函数表达式开头,而以单词function开头的语句是一个function语句。解决这个问题的方法就是把函数表达式括在一个圆括号之中。

  1. (function () {
  2. //…
  3. }());
时间: 2024-10-23 05:01:52

JS编程建议——18:比较function语句和function表达式的相关文章

JS编程建议——57:禁用Function构造函数

建议57:禁用Function构造函数定义函数的方法包括3种:function语句.Function构造函数和函数直接量.不管用哪种方法定义函数,它们都是Function对象的实例,并将继承Function对象所有默认或自定义的方法和属性.// 使用function语句编写函数function f(x){ return x; }// 使用Function()构造函数克隆函数var f = new Function("x", "return x;");// 使用函数直

JS编程建议——64:建议通过Function扩展类型

建议64:建议通过Function扩展类型JavaScript允许为语言的基本数据类型定义方法.通过为Object.prototype添加原型方法,该方法可被所有的对象使用.这样的方式对函数.数组.字符串.数字.正则表达式和布尔值都适用.例如,通过给Function. prototype增加方法,使该方法对所有函数可用.Function.prototype.method = function(name, func) { this.prototype[name] = func; return th

JS编程建议——59:推荐动态调用函数

建议59:推荐动态调用函数调用函数更便捷的方式是使用Function对象的call和apply方法.apply与call方法在本质上没有太大区别,只不过它们传递给函数的参数方式不同, apply是以数组形式进行参数传递,而call方法可以同时传递多个值.如果某个函数仅能够接收多个参数列表,而现在希望把一个数组的所有元素作为参数进行传递,那么使用apply方法就显得非常便利.function max(){ var m = Number.NEGATIVE_INFINITY; // 声明一个负无穷大的

JS编程建议——2:正确辨析JavaScript句法中的词、句和段

建议2:正确辨析JavaScript句法中的词.句和段JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词法侧重语言的底层实现(如语言编码问题等),以及基本规则的定义(如标识符.关键字.注释等).它们都不是最小的语义单位,却是构成语义单位的组成要素.例如,规范字符编码集合.命名规则.标识符.关键字.注释规则.特殊字符用法等.句法定义了语言的逻辑和结构,包括词.句和段的语法特性,其中段体现逻辑的结构,句表达

JS编程建议——30:使用递归模式

建议30:使用递归模式复杂算法通常比较容易使用递归实现.很多传统算法正是通过递归实现的,如阶乘函数. function factorial(n) { if(n == 0) { return 1; } else { return n * factorial(n – 1); } } 递归函数的问题:错误定义或缺少终结条件会导致函数长时间运行,使浏览器出现假死现象.此外,递归函数还会受到浏览器调用栈大小的限制. JavaScript引擎所支持的递归数量与JavaScript调用栈大小直接相关.只有IE

JS编程建议——65:比较函数的惰性求值与非惰性求值

建议65:比较函数的惰性求值与非惰性求值在JavaScript中,使用函数式风格编程时,应该对于表达式有着深刻的理解,并能够主动使用表达式的连续运算来组织代码.1)在运算元中,除了JavaScript默认的数据类型外,函数也作为一个重要的运算元参与运算.2)在运算符中,除了JavaScript的大量预定义运算符外,函数还作为一个重要的运算符进行计算和组织代码.函数作为运算符参与运算,具有非惰性求值特性.非惰性求值行为自然会对整个程序产生一定的负面影响.先看下面这个示例:var a = 2;fun

JS编程建议——67:套用函数

建议67:套用函数套用是JavaScript函数一个很有趣的应用.所谓套用就是将函数与传递给它的参数相结合,产生一个新的函数.在函数式编程中,函数本身也是一个值,这种特性允许用户以有趣的方式去操作函数值.例如,在下面代码中定义一个add()函数,该函数能够返回一个新的函数,并把参数值传递给这个新函数,从而实现连加操作.var add = function(n){ return function(m){ return n+m; } }document.writeln(add(2)(3)); //5

JS编程建议——68:推荐使用链式语法

建议68:推荐使用链式语法使用过jQuery框架的读者,都会对jQuery简洁的语法.灵巧的用法赞叹不已,其中一个最大亮点就是jQuery的链式语法.在JavaScript中,很多方法没有返回值,一些设置或修改对象的某个状态却不返回任何值的方法就是典型的例子.如果让这些方法返回this,而不是undefined,那么就要启用级联功能,即所谓的链式语法.在一个级联中,单独一条语句可以连续调用同一个对象的很多方法.getElement('box'). move(350, 150). width(10

JS编程建议——72:惰性载入函数

建议72:惰性载入函数惰性载入函数主要解决的问题也是兼容性,原理跟分支函数类似,下面是简单的示例.var addEvent = function(el, type, handle) { addEvent = el.addEventListener ? function(el, type, handle) { el.addEventListener(type, handle, false); } : function(el, type, handle) { el.attachEvent("on&q