当前位置:首页 > Web开发 > 正文

js函数、作用域、预编译和作用域链、闭包、立即执行函数

11-13 Web开发


//函数声明
//函数创建的几种方式
//这是最基本的创建方式a是函数名

function a(){};

//命名函数创建方式
//该创建方法会忽略函数名只能使用a来调用该函数mun无法调用该函数

var a = function mun(){};

//匿名函数创建方式
//
//匿名函数不能直接使用。
//匿名函数可以依附于一个变量,并且这个变量名就是这个匿名函数的名字。

var b = function(){};

//当匿名函数用在绑定事件中的时候,当这个事件执行的时候这个匿名函数也会被执行

window.onload=function(){
console.log("我是匿名函数");
}

//立刻执行函数
//函数声明前加"+","-","!","||",等运算符会和立即执行函数一样
//如果将匿名函数放入到表达式中并且后面加上小括号会自动执行这个函数(立即执行函数)
//函数定义完,立刻被调用,这种函数叫做立即执行函数
//立即执行函数只会执行一次执行完成后会被垃圾回收机制回收
(function(a,b){
console.log(a);
console.log(b);
}(10,20));//立刻执行函数也是可以传递参数的

//函数中还有一个return属性返回值
//如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined

function show(a,b){
var c=a+b;
}
var a=show(3,6);
console.log(a);

//如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值

function show1(a,b){
var c=a+b;
return c;
}
var a = show1(3,6);
console.log(a);

//如果函数使用了return语句,但是return后面没有任何值,那么函数的返回值也是:undefined

function show2(a,b){
var c=a+b;
return ;
}
var a = show2(3,6);
console.log(a);

//函数作为返回值使用值
function fun(){
console.log("fun被调用");
return function(){
console.log("这是一个函数");
}
}
var y = fun()
y();


// JS是解释执行(解释一行执行一行)
// 全局变量如果页面不关闭,那么就不会释放,会占内存,消耗内存;
// 隐式全局变量:声明变量没用var;
// 全局作用域:全局变量的使用范围;
// 局部作用域:局部变量使用的范围;

//预编译分为局部预编译和全局预编译
//局部预编译
//预编译分四步
//1.在程序执行前创建AO对象(局部作用域),函数执行前产生的空间
//2.找到形参和变量声明,将变量和形参名作为AO的属性名,但是值为undefined
//3.将实参合形参统一;
//4.在函数体里找到函数声明,将值赋予函数体。
//列子
function fn(a){
console.log(a);//function
var a = 123;
console.log(a);//123
function a(){}
console.log(a);//123
var b = function (){}
console.log(b);//function
function d(){}
}
fn(1);
//第一步在程序执行前创建AO对象(局部作用域),函数执行前产生的空间
//AO{
//}
//第二步找到形参和变量声明,将变量和形参名作为AO的属性名,但是值为undefined
//AO{
// a:undefined
// b:undefined
//}
//第三步将实参合形参统一;
//AO{
// a:1
// b:undefined
//}
//第四步4.在函数体里找到函数声明,将值赋予函数体。
//AO{
// a:function
// b:function
// d:function
//}

//为了更加熟练在来一个列子
function test(a,b){
console.log(a);//function
console.log(b)//function
c = 0;
var c;
a = 3;
b = 2;
console.log(b);//2
function b(){}
function a(){}
console.log(a)//3
function b(){}
console.log(b);//2
}
test(6,5);
//第一步在程序执行前创建AO对象(局部作用域),函数执行前产生的空间
//AO{
//}
//第二步找到形参和变量声明,将变量和形参名作为AO的属性名,但是值为undefined
//AO{
// a:undefined
// b:undefined
// c:undefined
//}
//第三步将实参合形参统一;
//AO{
// a:6
// b:5
//}
//第四步在函数体里找到函数声明,将值赋予函数体。
//AO{
// a:function
// b:function
//}

//全局预编译
//有三步
//第一步生成一个GO对象
//第二步查找全局变量声明,变量名作为全局对象属性,值为undefined;
//第三步 查找函数声明,值为全局函数引用
//例子:
var l=10;
console.log(test);
function test(test){
console.log(test);//function
var test = 234;
console.log(test);
function test(){}//234
}
test(1);
var test = 123;

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/web/10301.html