1:调用关键字function来构造
如:
function distance(x1,x2,y1,y2)
...{
var dx=x2-x1;
var dy=y2-y1;
return Math.sqrt(dx*dx+dy*dy);
}
2:使用Function()构造函数
如:
var f=new Function("x","y","return x*y");
这行代码创建了一个新函数,该函数和你所熟悉的语法定义的函数基本上时等价的:
function f(x,y)
...{
return x*y;
}
Function()构造函数可以接受任意多个字符串参数。它的最后一个参数时函数的主体,其中可以包含任何JavaScript语句,语句之间用分号分隔。其他的参数都是用来说明函数要定义的形式参数名的字符串。如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。
注意,传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被成为“匿名函数”。
你可能非常想知道Function()构造函数的用途是什么。为什么不能只用function语句来定义所有的函数呢?原因是Function()构造函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。这样做带来的负面影响效应就是每次调用一个函数时,Function()构造函数都要对它进行编译。因此,在循环体中或者在经常使用的函数中,我们不应该频繁地调用这个构造函数。
使用Function()构造函数的另一个原因是它能够将函数定义为JavaScript表达式的一部分,而不是将其定义一个语句,这种情况下使用它就显得比较的方面,甚至可以说精致。
3:函数直接量
函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。下面的三行代码分别使用function()语句、Funciont()构造函数和函数直接量定义了三个基本上相同的函数:
function f(x)...{return x*x};
var f=new Function("x","return x*x;");
var f=function(x)...{reurn x*x};
虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用。
例如:
var f=function fact(x)...{if(x<=1)return 1;else return x*fact(x-1);};
上面的代码定义了一个未命名函数,并对它的引用存储在变量f中。它并没有真正的创建一个名为fact()的函数,只是允许函数体用这个名字来引用自身。但是要注意,JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。
函数直接量的用法和用Function()构造函数创建函数的方法非常相似。由于它们都是由JavaScript的表达式创建的,而不是由语句创建的,所以使用它们的方式也就更加灵活,尤其适用于那些只使用一次,而且无需命名的函数。例如,一个使用函数直接量表达式指定的函数可以存储在一个变量中、传递给其他的函数甚至被直接调用:
a[0]=function(x)...{return x*x;};//定义一个函数并保存它
a.sort(function(a,b)...{return a-b;});//定义一个函数;把它传递给另一个函数
var tensquared=(function(x)...{return x*x;})(10);
和Function()构造函数一样,函数直接量创建的是未命名函数,而且不会自动地将这个函数存储在属性中。但是,比起Function()构造函数来说,函数直接量有一个重要的优点。由Function()构造函数创建的函数的主体必须用一个字符串说明,用这种方式来表达一个长而复杂的函数是狠笨拙的。但是函数直接量的主体使用的却是标准的JavaScript语法。而且函数直接量只被解析一次,而作为字符串传递给Function()构造函数的JavaScript代码则在每次调用构造函数时只需被解析一次和编译一次。
在JavaScript1.1中,可以使用构造函数Function()来定义函数,在JavaScript1.2和其后的版本中,还可以使用函数直接量来构造函数。你应该注意这两种方法之间的重要差别。
首先,构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但是函数直接量却是函数结构的一个静态部分,就像function语句一样。
其次,作为第一个差别的必然结果,每次调用构造函数Function()时都会解析函数体并且创建一个新东汉数对象。如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率非常低。另一个方面,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象。
Function()构造函数和函数之间量之间的第三点差别是,使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被当作顶级函数来编译,就像下面代码所说明的那样:
var y="global";
function constructFunction()
...{
var y="local";
return new Function("return y");//不捕捉局部作用域。
}
//这行代码将显示"global",因为Function()构造函数返回的函数并不使用局部作用域。
//假如使用一个函数直接量,这行代码则可能显示"local"。
alert(constructFunction());
分享到:
相关推荐
JavaScript函数式编程的知识点非常丰富,涉及很多方面的内容,下面将详细介绍几个核心知识点。 1. 函数式编程基础 函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的评估,并且避免...
JavaScript中定义类或函数,主要有以下几种方式: 1. 工厂方式 工厂方式是JavaScript中创建对象的一种模式,它通过一个工厂函数来封装创建对象的代码。通过工厂函数,我们可以创建多个具有相同属性和方法的对象实例...
使用window对象的方法有一个前提条件,即要确保函数是作为全局函数定义的。示例代码如下: ```javascript window.targetFunction = function() { alert(11111); return 9; }; test("targetFunction"); function ...
总结,JavaScript中定义函数的三种主要方式各有其适用场景,关键字function适合常规函数定义,Function构造函数可以实现函数的动态定义和编译,而函数直接量适合于那些不需要命名且只使用一次的函数。函数直接量和...
本文将深入探讨JavaScript中两种常见函数使用方式的区别:嵌套函数和在函数内部调用外部函数,并通过具体示例来阐述它们之间的差异。 #### 二、嵌套函数概述 嵌套函数是指在一个函数内部定义另一个函数的情况。...
本文档中的几个案例展示了JavaScript中几种特殊的函数用法,包括嵌套函数、递归函数以及内置函数。 1. **嵌套函数**: 嵌套函数是指在一个函数内部定义另一个函数的情况。在案例1中,`add`是外部函数,而`innerAdd...
JavaScript定义类的几种方式包括工厂方式、构造函数和原型方式,每种方法都有其特点和适用场景,接下来我们将详细探讨。 工厂方式是最早期的面向对象编程在JavaScript中的实践之一。使用工厂方式定义类,本质上就是...
1. **函数定义的简洁性**: - 箭头函数的语法更紧凑,可以视为匿名函数的一种简写形式。如果函数体只包含一个表达式,那么可以省略大括号和return关键字。例如: ```javascript let fun = () => console.log('la...
在匿名函数的代码模式方面,存在几种不同的写法。错误模式下,匿名函数的声明和调用不被支持,会导致语法错误。函数字面量模式则是声明一个函数对象后执行它。优先表达式利用圆括号来强制执行声明的函数,而Void操作...
本文将对这些函数定义方式及其区别和使用技巧进行分析。 首先,我们来看第一种也是最常用的函数定义方式——函数声明: ```javascript function func1([参数]) { // 函数体 } ``` 这种方式定义的函数也称为函数...
JavaScript定义函数的三种实现方法 【1】正常方法 function print(msg){ [removed](msg); } 对函数进行调用的几种方式: ...函数名(传递给函数的参数1,传递给函数的参数2,….... //构造函数方式定义javascript函数
这些函数可能包括但不限于以下几种: 1. **画线(lineTo)**:绘制直线,从当前绘图位置到指定的终点。 2. **填充路径(fillPath)**:根据定义的路径进行颜色填充。 3. **描边路径(strokePath)**:沿着定义的路径绘制...
本文将深入探讨在JavaScript中定义对象的几种常见方式,包括工厂模式、构造函数、原型以及继承。 1. 工厂方式定义对象: 工厂模式是一种创建对象的抽象方式,通过函数来创建具有相似特性的对象。这种方式的主要...
首先,JavaScript函数是一种对象,这使得它们拥有对象的所有属性和方法。函数对象连接到Function.prototype,而这个对象本身又连接到Object.prototype。在创建函数时,JavaScript引擎会为每个函数添加两个隐藏属性:...
在网页中调用JavaScript函数通常是通过以下几种方式实现的: 1. **事件处理**:当用户执行特定操作(如点击按钮)时,可以触发预先绑定的JavaScript函数。例如,在HTML元素中添加`onclick`属性,值为函数名或匿名...
函数可以通过几种不同的方式定义: 1. **传统函数声明**: ```javascript function func1(...params) { // 函数体 } ``` 2. **函数表达式**: ```javascript var func2 = function (...params) { // 函数体 }...
2. **实现接口**:为这个接口创建一个实现类,具体实现调用JavaScript函数的逻辑。这通常涉及到通过宿主环境提供的API来执行JavaScript代码。 3. **注册COM组件**:为了让JavaScript能够找到并调用COM组件,需要在...
在JavaScript中,函数扮演着至关重要的角色,它们不仅仅是代码块,更是数据的一种形式。JavaScript的灵活性使得函数可以作为变量、对象的方法甚至构造函数使用。理解函数的原型链和闭包对于深入掌握JavaScript至关...
为了更好地理解函数式编程在JavaScript中的应用,我们来看几个具体的示例: ##### 扩展数组排序 假设我们需要对一个数组进行排序,但不是简单的升序或降序,而是需要按照某种特定的规则进行排序。使用函数式编程...