Python web前端 07 函数及作用域
一、函数
1、有名函数和匿名函数
#函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 #函数就是包裹在花括号里面的代码块,前面使用了关键字function #分为有名函数和匿名函数 #有名函数:有名字的函数,函数名加括号执行/充当事件函数执行 #匿名函数:没有名字的函数,匿名函数不能单独出现,一般充当事件函数 oBox.onclinck=function(){..}; oBox.onclinck=fn;#这两个是一样的,后面的函数就是fn
2、函数定义和函数表达式
#函数表达式 特点:可以在后面加括号立即执行 fn(); function fn{ console.log(1);} #函数定义可以在定义前加括号执行,也可以在定以后加括号执行 fn(); var fn=function(){console.log(2);} #通过var定义的函数,只能在后面运行 #() + - ! ~ 可以将匿名函数变为函数表达式 function(){alert(3);}#匿名函数 +function(){alert(3);}();#前面加了+(() + - ! ~ )变为函数表达式,后面加上()便是调用 (function(){alert(3);})(); (function(){alert(3);}());#这两种加括号都可以
3、实参形参
#在使用函数时,加括号导致的函数执行时,可以传递参数(形参、实参、不定参) function fn(x){ alert(x); } fn(8);#执行函数时可以传递实参【用已知的变量(形参)或者具体的数据(实参)】 #形参:相当于函数局部的变量,命名规则和var相同,定义,无中生有 #很多个参数的情况 sum(4,9); function sum(q,w){ alert(g+w); }#形参和实参一一对应 #形参和实参数量不一样的情况 #实参大于形参 sum(4,9,3,5); function sum(q,w,e){ alert(g+w+e); }#可以运行,最后面的实参没有用 #形参大于实参 sum(4,9); function sum(q,w,e){ alert(g+w+e); }#出现NaN,传参的时候依次是q=3,w=9,e=undefined #可以给形参添加默认值 sum(4,9); function sum(q,w){ q=q||0;#设置默认值,q或者0 w=w||0; alert(g+w); }
4、不定参
sum(1,2,3,4,5,6,7,8,9,10); function sum(){ var x=0; for(var i = 0,len=arguments.length;i<len;i++){ x+=arguments[i];#将每个参数相加 } console.log(x); }
5、返回值return
function fn(){ console.log(2); return fn;#返回fn函数 }#每个函数默认返回undefined var a=fn; console.log(a);
二、作用域
1、解析顺序
#1、(定义)先解析var function参数 # a、该步骤的var只定义变量,后面的=赋值不解析 # b、该步骤的函数只定义函数,函数的执行不解析 # c、重名的只留一个、var和函数重名 函数优先 #2、(执行)在自上往下执行其他代码 #作用域: #作用:读写 域:范围,区域 #解析:自上而下 1、找var定义函数 参数 2、执行
2、
alert(a); var a=10; alert(a); #1、找 var a=undefined==>a=10(将库里面的a替换为10) #2、执行 alert(a)==>undefined a=10 alert(a)==>10
3、
alert(a); function a(){ alert(1); } alert(a); #1、找 a=function a(){ alert(1); } #2、执行 alert(a);#弹出函数体 #定义没调用,所以没关系 alert(a);#弹出函数体
4、
alert(a); function a(){ alert(4); } a(); alert(a); #1、找 a=function a(){ alert(4); } #2、执行 alert(a);#弹出函数体 a();#函数调用是新的作用域,只要是作用域,解析就要分两步 #1、找 :找不到 #2、执行: alert(4);==>4 alert(a);#弹出函数体
5、
alert(a); function a(){ alert(2); } var a=520; alert(a); #1、找(函数优先) a=function a(){ alert(2); } #2、执行 alert(a);#弹出函数体 a=520; alert(a);#弹出520
6、
var a=1; function fn(){ alert(2); var a=3; } fn(); alert(a); #1、找 a=undefined==》1 fn=function fn(){ alert(2); var a=3; } #2、执行 fn();#找 a=undefined #执行:alert(2);弹出 2 #a=3 alert(a); #弹出1#上面的函数只会改变函数里面的a,外面的改变不了
7、
var a=1; function fn(){ alert(2); a=3; } fn(); alert(a); #找 a=undefined fn=function fn(){ alert(2); a=3; } #执行 var a=1;#赋值a fn();#找:没找到 #执行:alert(2); 弹出2 # a=3;会去父级作用域找,从里往外找,会将外面的全局变量a赋值为3 alert(a);弹出3
8、
var a=1; function fn(a){ alert(2); a=3; } fn(); alert(a); #找 a=undefined fn=function fn(a){ alert(2); a=3; } #执行 a=1 fn();#找:a=undefined 原因是有形参的时候了会定义个a #执行 alert(a);弹出 2 #a=3 #赋值3 alert(a); #弹出1 里面的影响不了外面的
9、
var a=1; function fn(a){ alert(2); a=3; } fn(a); alert(a); #找 a=undefined fn=function fn(a){ alert(2); a=3; } #执行 a=1; fn(a);#找a=undefined #执行 fn(1);(相当于var a=1) #alert(2); #a=3 alert(a); #弹出1
10、
var a=function(){ alert(1); } function a(){ alert(2); } a(); #找 a=function a(){ alert(2); } #执行 a=function(){ alert(1); } a();#找 :无 #执行alert(1); 弹出1
三、数据类型
number方法
Number() #参数中必须能被转换为数字,否则返回NaN parseInt(解析的参数) #将参数转换位数字,只打印整数部分 parseFloat() #将参数转换位数字,不是数字就停,否则直到小数部分遇到不是数字就停 Num.toFixed(n) # 四舍五入保留n位小数 NaN(Not a Number) #不等于自己
数学方法
Math #数学方法 Math.pow(16,2) #16的2次方 Math.round(5.5) #四舍五入(整数) Math.ceil(0.2) #向上取整 Math.floor(0.9) #向下取整 Math.max() #取参数中的最大值 Math.min() #取参数中的最小值 Math.random() #0-1之间的随机数 Math.random()*m+n #n-(m+n)之间的随机数 Math.PI # π Math.abs() #求绝对值