一:javascript函数
javascript的Function也是一种对象,它的作用有三个:
1:普通的逻辑代码容器
2:对象的方法
3:构造函数
创建函数也有三种方法:
1:function语句定义函数(逻辑代码容器,计算两个数的和)。也称定义式;
function fun(x,y){
alert("arguments"+arguments[0]+" "+arguments[1]);
return x+y;
}
2:使用Function构造函数定义函数;
var fun = new Function("x","y",'alert("arguments"+arguments[0]+" "+arguments[1]);return x+y;');
3:在表达式中定义函数,也称声明式;
var fun = function(x,y){
return x+y;
}
三种定义函数是有区别的,主要是Function()构造函数可以动态定义和指定,而function语句只能预编译函数。因此每次调用Function构造函数定义的函数时,javascript都会去编译一次该函数。所以,如果一个函数经常被用到,就应该避免使用Function构造函数来定义函数。声明式和定义式还有稍微的区别。
如果采用定义式:
function fun(){
return 1;
}
var a =fun();
alert(a);
function fun(){
return 2;
}
var b =fun();
alert(b)
得到结果为:
2
2
而如果用声明式:
var fun= function(){
return 1;
}
var a =fun();
alert(a);
var fun= function(){
return 2;
}
var b =fun();
alert(b)
得到结果为
1
2
这种差别是由于JavaScript解释引擎的工作机制所导致的。JavaScript解释引擎在执行任何函数调用之前,首先会在全局作用域中注册以定义式创建的函数,然后再依次执行函数调用。由于注册函数时,后定义的函数重写了先定义的函数,因此无论调用语句位于何处,执行的都是后定义的函数。相反,对于声明式创建的函数,JavaScript解释引擎会像对待任何声明的变量一样,等到执行调用该变量的代码时才会对变量求值。由于JavaScript代码是从上到下顺序执行的,因此当执行第一个fun()调用时,fun函数的代码就是首先定义代码;而当执行第二个example()调用时,example函数的代码又变成了后来定义的代码。
二:函数的执行环境
JavaScript在解析代码时,会为声明或定义的函数指定调用对象。所谓调用对象,就是函数的执行环境。如果函数体内有以关键字this声明的变量,则this引用的就是调用对象。事实上,在普通的函数中,也存在调用对象,只不过这个调用对象是默认的全局window对象而已。例如
var fun = function(){
alert(this==window);
}
fun();
结果为true。全局作用域下定义或声明的函数的调用对象就是window。
在以下情况下会改变函数的执行环境
1 对象的方法调用其他的对象方法,如:
var dog = {};
dog.name = "heibao";
dog.age = "3 months";
dog.shout = function() {
return "Hello, My name is " + this.name + " and I am " + this.age + " old!";
}
dog.shout(); // “Hello, My name is heibao and I am 3 months old!”
有意思的是,对象也可以借用其他对象的方法:
var cat = {};
cat.name = "xiaohua";
cat.age = "2 years";
cat.greet = dog.shout;
cat.greet(); //“Hello, My name is xiaohua and I am 2 years old!”
2 使用函数对象的call和apply方法,还可以动态指定函数或方法的调用对象:
dog.shout.call(cat); //“Hello, My name is xiaohua and I am 2 years old!”
或者
dog.shout.apply(cat); //“Hello, My name is xiaohua and I am 2 years old!”
3 函数作为构造函数使用
JavaScript是通过构造函数来模拟面向对象语言中的类的。例如:
function Animal(sort, character) {
this.sort = sort;
this.character = character;
}
以Animal作为构造函数,就可以像下面这样创建一个新对象:
var dog = new Animal("mammal", "four legs");
创建dog的对象的过程如下:首先,new运算符创建一个空对象({}),然后以这个空对象为调用对象调用函数Animal,为这个空对象添加两个属性sort和character,接着,再将这个空对象的默认constructor属性修改为构造函数的名称(即Animal;空对象创建时默认的constructor属性值是Object),并且将空对象的__proto__属性设置为指向Animal.prototype——这就是所谓的对象初始化。最后,返回初始化完毕的对象。这里将返回的新对象赋值给了变量dog。
dog.sort; // mammal
dog.character; // four legs
dog.constructor; // Animal
聪明的读者结合前面介绍的内容,可能会认为使用new运算符调用构造函数创建对象的过程也可以像下面这样来实现:
var dog = {};
Animal.call(dog, "mammal", "four legs");
表面上看,这两行代码与var dog = new Animal("mammal", "four legs");是等价的,其实却不是。虽然通过指定函数的执行环境能够部分达到初始化对象的目的,例如空对象dog确实获得了sort和character这两个属性:
dog.sort; // mammal
dog.character; // four legs
dog.constructor; // Object —— 注意,没有修改dog对象默认的constructor属性
但是,最关键的是新创建的dog对象失去了通过Animal.prototype属性继承其他对象的能力。只要与前面采用new运算符调用构造函数创建对象的过程对比一下,就会发现,new运算符在初始化新对象期间,除了为新对象添加显式声明的属性外,还会对新对象进行了一番“暗箱操作”——即将新对象的constructor属性重写为Animal,将新对象的__proto__属性设置为指向Animal.prototype。虽然手工“初始化对象”也可以将dog.constructor重写为Animal,但根据ECMA262规范,对象的__proto__属性对开发人员是只读的,对它的设置只能在通过new运算符创建对象时由JavaScript解释引擎替我们完成。
JavaScript是基于原型继承的,如果不能正确设置对象的__proto__属性,那么就意味着默认的继承机制会失效:
Animal.prototype.greet = "Hi, good lucky!";
dog.greet; // undefined
事实上,在Firefox中,__proto__属性也是可写的:
Animal.prototype.greet = "Hi, good lucky!";
dog.__proto__ = Animal.prototype;
dog.greet; // Hi, good lucky!
但这样做只能在Firefox中行得通。考虑到在兼容多浏览器,必须依赖于new运算符,才能实现基于原型的继承。
原文地址:
http://zhuxinyu.iteye.com/blog/366272
分享到:
相关推荐
在JavaScript编程中,有时会遇到需要根据函数名的字符串形式来动态执行对应函数的场景。这类技术能够提供一种灵活的方式来执行代码,尤其在进行插件化开发、事件驱动编程或实现钩子函数时非常有用。为了实现这一功能...
不过,由于【标题】中提供了文档的名称——"JavaScript函数式编程.pdf",我可以根据这个名称扩展出关于JavaScript函数式编程的知识点。 JavaScript函数式编程的知识点非常丰富,涉及很多方面的内容,下面将详细介绍...
JavaScript函数式编程是利用JavaScript语言编写函数式风格代码的一种编程范式。函数式编程强调使用纯函数、避免副作用、函数的不可变性以及利用高阶函数等概念。通过阅读《JavaScript函数式编程指南》,读者可以了解...
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
### JavaScript中的函数声明与函数表达式 在JavaScript中,函数是一种非常重要的编程构造,它可以被定义为函数声明或函数表达式。这两种定义方式各有特点,并且在不同的上下文中有着不同的行为。 #### 函数声明...
### JavaScript函数大全解析 在深入探讨JavaScript函数的广泛应用与特性之前,让我们首先明确一点:JavaScript函数不仅是编程语言中的核心组件,更是实现复杂逻辑、封装功能模块的关键所在。不同于许多传统面向对象...
而《JavaScript函数式.zip》可能是一份关于JavaScript函数式编程的资料集合,函数式编程是一种编程范式,强调使用函数和避免改变状态。其中可能涵盖以下知识点: 1. **纯函数**:理解纯函数的定义,即给定相同的...
JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)...
此“javascript教程&函数大全.rar”压缩包文件包含了深入学习JavaScript和掌握其各种函数的重要资源。 首先,我们来看“Javascript教程.chm”文件,这通常是一个帮助文档或电子书,它可能包含了一系列关于...
JavaScript函数是编程语言的核心组成部分,它是一段可重复使用的代码块,可以接受参数并返回值。在JavaScript中,函数不仅可以作为表达式,还能作为变量赋值、作为参数传递以及作为返回值。本速查指南将深入探讨...
JavaScript函数是编程语言的核心组成部分,尤其在Web开发中起着至关重要的作用。这份"JavaScript函数速查手册"涵盖了JavaScript函数的各个方面,旨在帮助开发者快速查找和理解各种函数的用法和特性。 一、函数基础 ...
以下是关于JavaScript函数的详细讲解: 1. **函数定义**: - 无参函数定义:`function 函数名 () { 代码... }` - 有参函数定义:`function 函数名 (参数列表) { 代码... }` - 参数列表中的参数可以是变量、常量...
- 这里的回调函数用于处理JavaScript函数的异步返回结果,如果需要同步获取结果,可以使用`QWebEngineScript`来注册一个全局JavaScript对象,然后通过该对象调用JavaScript函数。 2. **JavaScript调用QT函数**: ...
当调用一个 JavaScript 函数时,该函数就会进入与该函数相对应的执行环境。如果又调用了另外一个函数(或者递归地调用同一个函数),则又会创建一个新的执行环境,并且在函数调用期间执行过程都处于该环境中。当调用...
JavaScript函数式编程是一种编程范式,它将计算视为数据处理,并强调使用无副作用的纯函数。在JavaScript中,函数式编程允许我们写出更简洁、可读性更强的代码,同时提高了代码的复用性和测试性。《JavaScript函数式...
1. `setTimeout`函数:这是一个内建的JavaScript函数,用于在指定的毫秒数后调用一个函数或执行某段代码。其基本语法是`setTimeout(function, delay)`, 其中`function`是要执行的函数,`delay`是延迟的时间,单位为...
JavaScript 函数式编程是一种编程范式,它将函数视为第一类公民,允许它们作为其他函数的参数、返回结果,甚至可以存储在变量中。在JavaScript中,函数式编程提供了更高级别的抽象,使得代码更简洁、可读性更强,...
本篇文章将深入探讨几个常用的JavaScript函数,这些函数在实际开发中非常常见且实用。 1. `console.log()` 这是开发者调试代码时最常用的函数之一。它用于在浏览器的控制台输出信息,帮助开发者查看程序执行过程中...