3.JS函数

3.函数

3.1 定义函数

定义方式一

绝对值函数

 function abs(x){
  if(x>=0){
  return x
  }else{
  return -x
  }
 }

一旦执行到return代表函数结束,返回结果!

如果没有执行return。函数执行完也会返回结果,结果就是undefined

定义方式二

 let abs=function abs(x){
  if(x>=0){
  return x
  }else{
  return -x
  }
 }

function(x){....}这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!

方式一和方式二等价

调用函数

 abs(10)
 > 10
 abs(-10)
 > 10

参数问题:JavaScript可以传递任意个参数,也可以不传递参数

 //可手动抛出异常
 if(typeof x!=='number'){
    throw 'Not a Number';
 }
 arguments
 代表传递进来的所有参数,是一个数组
 let abs=function abs(x){
    for(let i=0;i<arguments.length;i++){
        console.log(arguments[i])
    }
 }
 它会包含所有参数,若是想使用多余的参数来进行附加操作,需要排除已有参数

rest

ES6新特性,获取除了已经定义的参数之外的所有参数

 function aaa(a,b,...rest) {
         console.log(a);
         console.log(b);
         console.log(rest)
 }

rest参数只能写在最后面,必须用 ... 标识

3.2 变量的作用域

在JS中,let定义变量实际是有作用域的

 'use strict'
 function aa() {
     let x = 1;
     x=x+1;
 }
 x=x+2;//Uncaught ReferenceError: x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

 'use strict'
 function aa() {
     let x = 1;
     x=x+1;
 }
 function bb(){
     let x=1;
     x=x+1;
 }
 //内部函数可以访问外部函数的成员,反之则不行 
'use strict'
function aa() {
let x = 1;
x=x+1;
function bb(){
let y=x+1;//y=2
}
let z=y+1//报错
}
//假设内部函数变量和外部函数变量重名,由内向外查找,若有重名对象,则优先用自身函数
'use strict'
function aa() {
let x = 1;
function bb(){
let x='a'
console.log(x)
}
console.log(x)
bb()
}
//两段代码等价,提升变量作用域
function aa() {
let x="x"+y;
console.log(x);
let y="y";
}
function aa() {
let y;
let x="x"+y;
console.log(x);
y="y";
}

说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值

所有变量都放在函数的头部,不要乱放,便于代码维护

全局变量

'use strict'
let x=1
function aa() {
console.log(x);
}
aa()
console.log(x)
var x="xxx"
alert(x)
alert(window.x)//默认所有的全局变量都会自动绑定在window对象下

alert()这个函数本身也是一个window变量

'use strict'
var x="xxx"
window.alert(x);
var old=window.alert;
old(x)
window.alert=function () {

}//发现alert失效了
//恢复
window.alert=old

JS实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错ReferenceError

规范:

由于我们所有的全局变量都会绑定到我们window上,如果不同的js文件,使用了相同的全局变量,冲突,如何减少冲突?

let cc={}
cc.name='233'
cc.add=function (a,b) {
return a+b;
}

把自己的代码全部放入自己定义的唯一空间中,降低名字的冲突问题

局部作用域 let

function aaa() {
for (var i =0;i<100;i++){
console.log(i);
}
console.log(i+1);
}

会发现最后输出101

把var改成let后

最后报错

建议都是用let定义局部作用域变量

常量 const

在ES6之前是如何定义常量的?只有用全部大写字母命名的变量就是常量

所以在ES6引入常量关键词const

const PI=3.14;
PI=3// TypeError: Assignment to constant variable.

3.3 方法

定义方法

//方法就是把函数放在对象里面,对象只有两个东西:属性和方法
var cc={
name:'yy',
birth:2020,
//方法
age:function () {
//今年减出生年月
var now= new Date().getFullYear();
return now-this.birth
}
}
//属性
cc.name
//方法,一定要带括号
cc.age()
function getAge() {
var now= new Date().getFullYear();
return now-this.birth
}
var cc={
name:'yy',
birth:2020,
//方法
age:getAge()
}
//cc.age() OK
//getAge() NaN 此时是window的this

this是无法指向的,是默认指向调用它的对象的

apply 在js中可以控制this的指向

getAge.apply(cc,[])//this指向了cc对象,参数为空
 
posted @ 2022-09-06 22:32  l希尔瓦娜斯l  阅读(44)  评论(0)    收藏  举报