JS 函数
初始函数
Function类型,即函数的类型。
典型的JavaScript函数定义:
function 函数名称(参数表){ //函数执行部分 return ;}//注意:参数列表直接写形参名即可
return语句:return返回函数的返回值并结束函数运行
函数也可以看做数据来进行传递
参数列表相当于函数入口,return 语句相当于函数出口
函数可以作为参数来传递。
function test ( a ) { a(); } test(function () { alert(1); });
函数可以嵌套定义
function test2(){ function test3(){ alert(1); } test3();}test2();
定义函数
三种定义函数的方式:
function语句形式
函数直接量形式
通过Function构造函数形式定义函数
//1 function 语句式function test1 () { alert(1);}//2 函数直接量 (ECMAScript 推荐)var test2 = function () { alert(2);}//3 function 构造函数式var test3 = new Function('a','b','return a+b;'); //最后一个参数是函数结构体 test3(10,20);
function语句
Function构造函数
函数直接量
兼容
完全
js1.1以上
js1.2以上版本
形式
句子
表达式
表达式
名称
有名
匿名
匿名
性质
静态
动态
静态
解析时机
优先解析
顺序解析
顺序解析
作用域
具有函数的作用域
顶级函数(顶级作用域)
具有函数作用域
静态动态的区别
var d1 = new Date();var t1 = d1.getTime();for ( var i=0; i
//扩充作用域,底层也经常使用这两个方法,用于绑定不同的作用域。
//把一个函数赋给一个对象, 赋完之后,还可以重用,赋给另外一个对象。
window.color = 'pink';
var obj = {
color: 'tan'
}
function showColor () {
console.log( this.color );
}
showColor.call(window);
// showColor.call(this);
showColor.apply(obj);
call方法简单的实现
function test1 ( a,b ) {
return a + b;
}
//自定义对象
function Obj ( x,y ) {
return x * y;
}
var obj = new Obj();
//挂载到对象上
obj.method = test1;
//执行该函数
obj.method(10,20);
//执行完后删除
delete obj.method;
# 执行环境和作用域链概念执行环境(execution context)是javascript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。**每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。**虽然我们的代码无法访问这个对象,但是解析器在处理数据时会在后台执行它。全局执行环境是最外围的一个执行环境。根据ECMScript实现所在的宿主环境不同,表示执行环境的对象也不一样。每一个函数都有自己的执行环境。当执行流进一个函数时,函数的环境就会被推入一个**环境栈**中。而在函数执行之后,栈将其环境弹出,**把控制权返还给之前的执行环境**。当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是**保证对执行环境有权访问的所有变量和函数的有序访问**(控制代码的访问权限)。
var color1 = "blue";
function changeColor () {
var color2 = "red";function swapColor () { var color3 = color2; //color3 = 'red' color2 = color1; //color2 = 'blue' color1 = color3; //color1 = 'red' console.log( color1,color2,color3 ); }swapColor();
}
changeColor();
//环境变量 可以一层一层的向上进行追溯 可以访问它的上级 环境(变量和函数)
// 作用域链 具有层级关系
//在大型程序中,全局变量,尽量少使用,因为全局变量总是最后一次搜索。 防止全局变量污染。//很少去定义全局变量,效率比较慢。
# 垃圾收集和块级作用域的概念## 垃圾收集javascript是一门具有自动垃圾收集机制的编程语言。开发人员不必关心内存分配和回收问题。垃圾回收器也是每隔一段时间去进行回收。离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。**标记清除**是目前主流的垃圾收集算法。这种思想是给当前不使用的值加上标记,然后回收其内存。
//垃圾收集 ,标记清除 (模拟)
function test () {
var a = 10; //mark - 被使用var b = 20; //mark - 被使用
}
test(); //执行完毕 之后 ,a,b又被标记使用。 mark - 没有被使用
//在间隔时间中 回收。 如果mark 没有被使用, 则回收。
//引用计数(模拟)
//如果变量被引用 , count = 1;
function test2 () {
var a = 10; //count = 1;var b = 20;var c;c = a; //count++ = 2; //a 被 c 所使用 ,引用。a = 50; //count--; //重新被赋值 count-- //等待 count 为 0 的时候, 垃圾回收机制 就回收
}
## 块级作用域javascript里面没有块级作用域的概念,所以在使用if、for时候要格外的小心。javascript模拟块级作用域 (块级作用域,相当于内部的执行体,一个执行环境)利用 IIEF的特性
//当函数执行之后, 变量就被回收
function test () {
(function () { //函数有一个单独的作用域,外面无法访问到 i for ( var i=0; i
var name = "xiao A";var obj = { name : "xiao B", getName: function(){ var self = this; return function(){ return self.name; } }};//console.log( obj.getName().call(obj) );console.log( obj.getName()() );//闭包: 一个函数, 可以访问另外一个作用域中的变量//封闭性,(类似食品包装袋一样,封闭起来,保质期延长,变量的访问范围的延长) //private 起到一个保护变量的作用
//1 level function f(x){ //2 level var temp = x; //局部变量 //temp 标记 已经没有被使用 return function(x){ //3 level (function 有一个执行域) temp += x; //temp 下一级作用域仍然被引用 , 标记为 使用 alert(temp); }} //js 垃圾回收机制,当函数执行完毕后,内部所有的局部变量都集体的被回收。var a = f(50);a(5); //55a(10); //65a(20); //85
关键字:JavaScript
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!