29 对象&函数
switch:
穿越:
没有判断结果的情况下执行下一个case的语句块,叫穿越
或者穿越:
switch(s%10){ case 1: case 2: case 3: s++; break; default:...; }
累积穿越:
switch(s%10){ case 0: s = 100; case 1: case 2: case 3: s++; break; default:...; }
switch判断:
switch(true){//此处必须写true,否则不会进入下面代码块 case s > 90:...; break; case s > 95:...; break; case s > 95:...; break; default:...; }
对象
设置变量的属性:
obj[a] = value;
如果a为变量,那么对象的key为此变量a的值,a的值改变,变量的key也改变
如果a为常量,那么对象的key为a本身
对象的key在ES5下必须是字符串类型
var obj = {a:1}; var t = 9; obj[t] = 2;//obk[9] = 2; obj['a'] = 3;//{a:3} obj[10] = 1;//{10:1} obj.a = 100;//{a:100} console.log(obj);
for in循环:
遍历对象、数组、字符串的key,是ES5标准
var obj = {x:1,y:2,z:3} for (const key in obj) { console.log(key);//打印x,y,z console.log(obj['key']);//打印undefined,没有此key可以对应的值 console.log(obj[key]);//打印obj中key为x,y,z对应的值 }
函数:
script标签创建时,会优先将函数存入堆中,将函数名存入栈中(匿名函数只有在代码运行到定义匿名函数后才能调用,没有被预先放入栈中,不在此列)
下面的script标签可以调用上面script标签定义的内容,反之不能
<script> var first = 1; // console.log(second);报错not defined </script> <script> var second = 2; console.log(first);//打印1 </script>
匿名函数:
var fn = function(){}
包括自执行函数: (function(){})();
构造函数
var fn = new Function("a","b","console.log(a+b)"){}
作用域:
一个东西所作用的范围
作用域是相对于函数来说的
函数外定义的变量可以在函数中调用
函数内定义的变量不能被函数外调用(var定义)
如果函数中没有用var定义变量,直接使用变量(a = 10),
该变量是全局变量,即window.a.(ES6不允许)也有叫做变量作用域提升
在函数中任意位置使用var定义的变量都是局部变量,就算if和for中的也一样,即使没有进入if()语句,那么也是定义了局部变量
局部变量:在函数内用var定义的变量,参数就是局部变量
全局变量:在函数外用var定义的变量就是全局变量
参数:
执行函数时填入值与函数参数列表顺序一致
参数可以是任意内容,如果没有传入参数,就是undefined
js是一个弱类型语言,因此参数不能强制约定类型(有时需要判断)
ES5中不能设置参数默认值,ES6可以
参数是局部变量也是临时变量,_w,_h,_color
参数列表:
如果参数数量不确定,或者不设置参数,却又在调用函数时传入了参数
那么参数就会存在于参数集arguments中
arguments是个虚伪数组
arguments.callee:代表函数本身
arguments.callee.caller:代表调用当前函数的环境函数(谁调用我我就是谁)
回调与递归:
回调:我调别人
递归:我执行我自己
堆栈溢出: 递归回调次数过多,或者没有终结递归回调的条件