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

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部