1、Error:错误对象:
-
1、*浏览器自带4种错误类型: 语法错误:SyntaxError - 多半都是哪里的符号写错了 引用错误:ReferenceError - 根本就没有创建过,就去使用了 类型错误:TypeError - 不是你的方法,你却使用了 范围错误:RangeError - 只有一个API:num.toFixed(d);//d的范围只是0-100之间
-
2、错误处理:当程序发生错误时,保证程序不会异常中断的机制 为什么:只要报错,就会导致后续代码终止(闪退),用户体验感降低 如何:try...catch...语句 try{ 可能出错的代码 }catch(err){ console.log(err);//提示用户错误的原因是什么 }
后续代码都可以执行到 不推荐:try...catch...的执行效率非常的低下,更推荐的是if...else 3、抛出自定义错误: throw new Error("自定义错误信息");
例题:程序员甲:实现了一个round函数,可按任意小数位数四舍五入。但如果传入的数据不是数字或不 能被隐式转为数字,则会抛出异常。 程序员乙:实现了一个结账函数checkout。可输入总价,收款金额,计算找零。其中,为了处理 舍入误差,调用了程序员甲的round函数。乙如何进行异常处理? 分别实现round函数和checkout函数。
function round(num, n) {
if (!isNaN(num) && !isNaN(n)) {
num *= Math.pow(10, n);
num = Math.round(num);
num /= Math.pow(10, n);
return num;
} else {
throw new Error("請輸入正確的數字")
}
}
function chekout() {
var tol = prompt("总价");
var pay = prompt("收款金额");
//try...catch..方式:
// try {
// alert("找零" + round(pay - tol, 2))
// }catch(err){
// alert(err)
// }
//if...else..方式:
if (!isNaN(tol) && !isNaN(pay)) {
alert("找零" + round(pay - tol, 2))
} else {
alert("请输入正确的数字")
}
}
chekout();
2、Function:函数对象 - 方法
-
创建:3种
1、声明方式 function 函数名(形参列表){函数体;return 结果;} 具有完整的声明提前 2、直接量方式 var 函数名=function(形参列表){函数体;return 结果;} 也有声明提前,但是赋值留在原地 3、构造函数方式 - 函数体不是固定的 var 函数名=new Function("形参1","形参2",...,"函数体"); 函数体是动态拼接时候,注意不能省略""部分调用:
函数名(); 元素.onclick();重点:
1、创建: 2、作用域:全局(成员哪里都可以使用)、函数(成员只能在函数调用时内部可用) 变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错 3、声明提前:在程序正式执行之前,会将var声明的变量和function声明的函数集中提前到当前作用域的顶部,但是赋值留在原地,变量比函数轻,会在更上面 4、按值传递:如果传递的是原始类型,互不影响。如果传递的是引用类型,相互影响。 5、***重载:相同的函数,根据传入的实参的不同,会自动选择对应的函数执行 问题:JS不支持重载,JS不允许同时存在多个同名函数,如果存在,最后的一个会覆盖之前的所有函数 解决:arguments对象 - 只能在函数内部可用,是一个类数组对象: 作用:接住所有的实参,【以后甚至不用形参都可以了】 与数组有3点相同: 1、支持下标 2、支持length 3、支持遍历 变相实现重载:通过判断arguments的不同,执行不同的操作 例题:定义一个add()函数,使用arguments对象计算该方法接收到的所有的参数的算术和
function add() {
for (var i = 0, tol = 0; i < arguments.length; i++) {
tol += arguments[i];
}
return tol
}
console.log(add(1, 2, 3));
6、***匿名函数:理解概念
没有名字的函数,没有变量名/函数名引用着,调用完毕后会立马释放 - 一次性函数
2种:
1、匿名函数自调:代替全局作用域
(function(){
函数体; - 好处:调用完毕会【立刻释放】
})()
2、匿名函数回调:某个函数调用时,传入的实参又是一个函数,而且不需要我们调用自动执行
比如:
arr.sort(function(a,b){return a-b})
str.replace(reg,function(){})
***你要认识什么叫做回调函数:
匿名函数,不是自调,就一定是回调
3、this指向
- this关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象
- 在单个元素绑定事件时 this-->当前元素
- 多个元素绑定事件时 this-->当前触发触发事件的元素
- 作为对象的方法调用(例如
obj.b())this-->调用此函数的对象 - 构造函数中使用(例如
new b())this-->正在创建的对象 - 箭头函数 this-->外层的this对象(固定,不可以更改)
- 直接调用 this-->全局对象window(在浏览器环境中全局对象是 Window,在Node.js环境中是global对象)
- 定时器中使用 this-->window