8、函数
-
定义函数,方式一
fuction abs(x){ if(x >=0){return x} else{return -x} }
- 注意:一旦执行到return,代表函数结束,返回结果;如果没有执行return,函数执行完也会返回结果,结果就是undefined
-
定义函数,方式二
var(let) abs = fuction(x){ if(x >=0){return x} else{return -x} }
- fuction()是一个匿名函数,可以将其赋值给变量
-
调用函数
-
参数问题
1、不存在参数问题
//在参数内添加如下: if(typeof x !== 'number'){throw 'Not a Number'}
2、arguments
-
arguments是代表传递进来的所有的参数,是一个数组,但是其包含所有的参数,我们有时候想试用多余的参数来进行附加操作,需要排除已有的参数。如:
abs(213,23,123,1,24,3,25,76,9)//函数承接上文定义中的代码 x = 213 arguments(9){[213,23,123,1,24,3,25,76,9]}
3、rest
-
rest也是带表传递进来的所有参数,也是一个数组,不过其不包含已被使用的参数。如:
fuction abs(x,...rest){...}//定义时有些许不同 abs(213,23,123,1,24,3,25,76,9)//函数承接上文定义中的代码 x = 213 arguments(9){[213,23,123,1,24,3,25,76,9]} rest(8){[23,123,1,24,3,25,76,9]}//参数213已被传递给x,故rest中没有213
-
-
9、变量的作用域
- 在js中的变量是有定义域的,若在函数体中声明在函数体外不可使用
function abs(){
let x = 1;
x = x + 1;
}
x = x + 2;//Uncaught ReferenceError: x is not defined
-
内部函数可以访问外部函数的成员,但外部函数不能访问内部函数的成员
function abs(){ let x = 1; x = x + 1; function abc(){ let y = x + 1; } z = y + 1; } console.log(y)//不报错 console.log(z)//报错
-
js中,函数查找变量从自身函数开始,由内向外查找,内部拥有变量,则不使用外部变量,若没有则查找使用外部变量
function abs(){ let x = 1; function abc(){ let x = 2; console.log(x);//输出2,不再查询外部函数 } console.log(x);//输出1,查询不了内部函数 abc() }
-
提升变量的作用域:js执行引擎自动提升变量的声明,但不会优先赋值(不先于赋值前的操作)
function abs(){ let x = 1; y = x + 1; let y; }//此时不会报“y未被声明”的错,但当x有值时,y不会被赋值
-
全局函数
-
全局变量
x = 1;//x为全局变量,声明不需要加数据类型,且在函数外 function abs(){...}
-
全局对象window
var x = 'xxx'; alert(x); alert(window.x);//所有的全局变量会被window对象纳入旗下,该语句和上一条语句输出一致
-
js实际上只有一个全局作用域,任何变量(包括自定义及内部函数)若没有在函数作用范围内找到,就会向外查找,若在全局作用域没有找到,就会报错
let x = "xxx"; window.alert(x); let old_alert = window.alert; window.alert = function (){ }; window.alert(123);//此时alert函数失效 window.alert = old_alert; window.alert(456)//alert()恢复 window.alert(y);//报错Uncaught ReferenceError: y is not defined
- 注意:由于所有全局变量都会绑定到window上,若果不同的js文件使用了相同的变量,则会发生冲突
-
局部作用域let
-
在for循环中,若括号内使用var:
function aaa(){ for(var i = 1; i < 100; i++) { console.log(i);//依次输出1~99 } console.log(i+1);//最后输出101 }
-
若使用let:
function aaa(){ for(let i = 1; i < 100; i++) { console.log(i);//依次输出1~99 } console.log(i+1);//报错,没有找到变量i }
-
-
常量定义const
- 使用const定义的变量为常量,其值不可更改
- 注意:在ES6之前常量均是使用“var+大写字母”定义的,遇见时不建议更改
-
10、方法
-
方法就是把函数放在对象里,对象只有两个东西,属性和方法
let lisi = { name:"小明", birth:2020, age : function() { let now = new Date().getFullYear(); return now-this.birth;//this仅在调用this的元素的上一级寻找指定变量 } }; lisi.name;//调用对象属性 lisi.age();//调用对象的方法 }
-
关于this
//将上述代码改成: var getage = function(){ var now = new Date().getFullYear(); return now-this.birth; } let xiaoming = { name:"小明", birth:2020, age : getage }; xiaoming.age()//再次输出小明年龄时也可以输出 getage()//输出getage函数是结果是NaN,即this此时失效
-
关于apply
-
由上述可知,当函数体外部没有函数时,this失效,因此js引入apply来给this定向,如:
var getage = function(){ var now = new Date().getFullYear(); return now-this.birth; } let xiaoming = { name:"小明", birth:2020, age : getage }; getage.apply(xiaoming,[])//输出age的值,apply括号内有两个参数,第一个为this指向的对象,第二个为给this传递的参数(没有参数时传空参)
-
11、内部对象
-
标准对象
-
typeof 123 'number' typeof '123' 'string' typeof true 'boolean' typeof NaN 'number' typeof [] 'object' typeof {} 'object' typeof Math.abs 'function' typeof undefined 'undefined'
-
-
Date
-
var now = new Date();//完整时间 now.getFullYear();//获取年 now.getMonth();//获取月,注意js中的月份是0-11月 now.getDate();//获取日 now.getDay();//获取星期 now.getHours();//获取小时 now.getMinutes();//获取分钟 now.getSeconds();//获取秒 now.getMilliseconds();//获取毫秒 console.log(new Date(1645018084175));//将时间戳转为普通时间
-
转换
console.log(new Date(1645018084175));//将时间戳转为普通时间 now.toLocaleString()//获取当地时间 now.toGMTString()//当地时间转为GMT时间
-