JS函数
来源:互联网 发布:游戏美工培训学费 编辑:程序博客网 时间:2024/05/19 13:56
JS函数基础
0.目前掌握的情况:
声明:function xxx(){} 或匿名element.onXXX()=function(){}调用:函数名传参问题: 作用域 函数执行原理过程……新问题: 构造函数 函数式编程
1. 定义
1.1 function functionName(parameter1,parameter2,……){}1.2 return:函数停止执行,返回表达式的值(默认是undefined)1.3 嵌套函数:function test(a,b){ function square(x){ return x*x; } return Math.sqrt(square(a)+square(b));}/*内部函数square()可以访问外部函数的变量*/不严格规范:01 函数声明语句不能出现在循环、条件或try/cache/finally以及with语句中02 函数表达式语句可以出现在js代码的任意位置
2. 调用
四种方式: 作为函数|方法|构造函数|通过他们的方法:call()、apply()间接调用
2.1 函数调用:
不理解: 如果该函数返回是因为解释器到达结尾,返回值就是undefined; 根据ECMScript5,调用上下文(this的值)是全局对象 通过this判断当前是否是严格模式? http://www.cnblogs.com/ouyangping/p/6445877.html
strict pattern(严格模式):<script type="text/javascript"> "use strict";//使用严格模式的语法 var strict = (function(){ return !this;//此时为true }()); console.log(strict); </script>
2.2 方法调用:
将函数定义为对象的方法 eg. o.m = f; 调用:o.m(); o["m"](x,y)//x,y是函数m的参数 与函数调用的区别: 调用上下文:对象o,函数体可以使用this引用该对象
<script type="text/javascript"> "use strict" var calculator = { op1 : 1, op2 : 2, add : function(){ this.result = this.op1+this.op2; //直接给对象增加属性result } }; calculator.add(); console.log(calculator.result);</script>
2.3 构造函数调用:
2.4 间接调用:
call()apply()
3. 实参和形参
3.1 可选形参:
实参比形参个数少时,形参默认值是undefined
赋合理值:if(a === undefined) a=[];or:a=a||[];//前提是a要被预先声明注:可选参数函数请加注释:function getProperties(o,/*optional*/a){}//其中a表示可选参数
3.2 可变长的实参列表:
这种情况是实参个数大于形参个数针对此,js默认行为是省略 实参对象引用:arguments,类数组对象应用: 01 检验实参个数——arguments.length; 02 实现接受任意实参的函数——不定实参函数(不定个数|值|顺序),==此时实参个数不可以为零==callee:指代当前正在执行的函数caller:指代调用callee的函数
callee:用于匿名函数的递归调用var factorial = function(x){ if(x <= 1)return 1; return x*arguments.callee(x-1);}/*将对象属性作为实参*/ function arr(/*array*/from1,/*index*/from_start,/*array*/to,/*index*/to_start,/*integer*/length){ console.log(from1) } function easycopy(args){ arr(args.from1,args.from_start||0, args.to,args.to_start||0,args.length); } var a=[1,2,3,4]; var b=[]; easycopy({from1:a,to:b,length:4});
注:所有的原始类型都能转化为String;
所有的对象都包含toString();
写代码时最好加上实参类型检查。
p177
4. 值和命名空间
4.1作为值的函数
自定义函数属性: functionName.property = value;
4.2作为命名空间的函数
定义函数并立即调用: (function(){}());
5.闭包
作用域链:变量查找的范围,从包含自己的函数开始不断向外层作用域查找 闭包:函数变量可以被隐藏在作用域链之内 http://blog.csdn.net/yueguanghaidao/article/details/9568071
var scope="global"; function t(){ console.log(scope); //<==>var scope; // console.log(scope); //函数体内的声明会覆盖全局变量,out="undefined" var scope="local" console.log(scope); } t();
<html> <head> <script type="text/javascript"> function buttonInit(){ for(var i=1;i<4;i++){ var b=document.getElementById("button"+i); console.log(i);//1,2,3 b.addEventListener("click",function(){ alert("button"+i);},false); } console.log(i);//4} i=5;console.log(i);window.onload=buttonInit; </script> </head> <body> <button id="button1">Button1</button> <button id="button2">Button2</button> <button id="button3">Button3</button> </body> </html>
利用闭包实现的私有属性存取器方法<script type="text/javascript"> function addPrivateProperty(o,name,/*验证函数*/predicate){ var value;//属性值 //属性的getter() /*!!两个闭包共享变量value!!*/ o["get"+name] = function(){ return value; console.log("getName="+value); }; o["set"+name] = function(v){ if(predicate&&!predicate(v)) throw Error("set"+name+":invalid value "+v); else{ value = v; console.log("setName="+value); } }; } var o = {};//定义一个空对象 addPrivateProperty(o,"Name",function(x){ return typeof x == "string"; }); o.setName("Frank"); console.log(o.getName());//Frank// o.Name="Hello" console.log("o.Name="+o.Name);//undefined,不可以直接获取// o.setName(0);</script>
关联到闭包的作用域链都是”活动的”
with语句:
wait a minute!
6.属性、方法
属性: length:arguments.length 函数名.length:形参个数 prototype call(): 语法:调用的函数.call(对象引用,参数1,参数2,……) apply(): 语法:调用的函数.apply(对象引用,[参数1,参数2,……])
泛函:一种变换——将函数转换为另一种函数或值
阅读全文
0 0
- JS 函数
- js 函数
- js 函数
- js 函数
- JS函数
- js函数
- js函数
- js函数
- JS函数
- js函数
- js 函数
- js函数
- JS函数
- js函数
- js 函数
- js函数
- js-函数
- js 函数
- chrome 下使用维基百科
- 关于脑裂
- Android Studio APK打包
- APK瘦身
- binder学习概述篇和路线图
- JS函数
- 算法作业_38(2017.6.20第十八周)
- Swift15-闭包
- Linux 信号(二)信号集
- ###django 不依赖工程执行orm操作
- github常见操作和常见错误!错误提示:fatal: remote origin already exists.
- android选择城市三级联动
- JAVA中的数据存储(堆及堆栈)
- ROC和AUC介绍以及如何计算AUC F