JS函数

Posted wn-888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS函数相关的知识,希望对你有一定的参考价值。

2.函数

定义函数

定义方式一

绝对值函数

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

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

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

定义函数二

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

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

调用函数

abs(10) // 10
abs(-10)//10

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

参数进来是否存在问题?

假设不存在问题,如何规避?

var abs = function(x){
    //手动抛出异常来判断
    if(typeof x!==‘number‘){
throw ‘Not a Number‘;
}
    if(x>0){
        return x;
    }else{
        return -x
    }

arguments

argument是一个JS免费赠送的关键字

代表,传递进来的所有参数,是一个数组

var abs = function(x){
    console.log("x=>"+x);
    for(var i = 0; i<arguments.length;i++){
        console.log(argument[i]);
    }
    if(x>0){
        return x;
    }else{
        return -x;
    }
}

问题:arguments 包含所有的参数,我们有时候想使用多余的参数来进行附加操作.需要排除已有参数~

? rest

以前

if(arguments.length>2){
    for (var i= 2;i<agruments.length;i++){
        //...
    }
}

ES6引入了进的特性,获取除了已经定义的参数以外的所有参数

function aaa(a,b,...rest){
    console.log("a=>"+a);
    console.log("b=>"+b);
    console.log(rest);
}

函数的作用域

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

假设在函数体中声明 , 则在函数体外不可以使用~ (如果非要实现的话,后面研究一下闭包)

function qj(){
	var x = 1;
	x = x + 1;
	}
	x=x+2;// 报错:Uncaught referenceError: x is not defined

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

function qj(){
var x =1;
x = x + 1;
}
function qj2(){
var x = `A`;
x = x + 1;
}

内部函数可以访问外部函数的成员,反之则不行

function qj(){
var x =1;
    //内部函数可以访问外部函数的成员,反之则不行
   function qj2(){
       var y = x+1; //2
   }
    var z = y+1;//Uncaught referenceError:y is not defined
}

假设,内部函数变量和外部函数的变量,重名!

function qj(){
	var x = 1 ;
		function qj2(){
			var	x = ‘A;
            console.log(‘inner‘+x); //innerA
        }
      console.log(‘outer‘+x); //outer1
}
qj()
qj2()

假设在JS中函数查找变量从自身函数开始,由查找,假设外部存在这个同名的函数变量,则内部函数就会屏蔽外部的函数变量

? 提升变量的作用域

function qj(){
    var x = "x" + y;
    console.log(x);
    var y = "y";
}

结果: xundefined

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

如下

function qj(){
    var y;
    var x = "x" + y;
    console.log(x);
    var y = "y";
}    

这个是在javascript建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码的维护;

function qj2(){
    var x = 1,
    y = x + 1,
        z,i,a;//undefined
    //之后随意用
    }

全局对象 window

默认的所有的全局变量都是绑定在 window 对象下

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

? 规范

由于我们多有的变量都会绑定到我们的window上,如果不同的JS文件,使用了相同的全局变量,就会导致冲突-> 如果能够减少冲突?

//唯一全局变量
var a = {};
//定义全局变量
a.name = ‘A;
a.add= function(b,c){
    return b+c
}

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

? 局部变量 let

function aaa(){
    for (var i = 0; i< 100;i++){
        console.log(i)
    }
    console.log(i+1); //问题: i出了这个作用域 还可以使用
}

ES6 let关键字,解决局部作用域冲突的问题~

function aaa(){
    for (let i =0;i<100; i++){
    	console.log(i)
    }
    console.log(i+1);//Uncaught ReferenceError: i is not defined
}

建议使用let定义局部变量

? 常量 const

在ES6之前,怎么定义常量,只有用全部大写字母命名的变量就是常量,建议不要修改这样的值

var PI = ‘3.14‘;
console.log(PI);
PI = ‘123‘; //可以修改
console。log(PI);

在ES6引入了常量关键字const

var PI = ‘3.14‘; //只读变量
console.log(PI);
PI = ‘123‘; //报错: TypeError:Assignment to constant variable
console。log(PI);

方法

定义方法

方法就是把函数放在对象里面,对象只有两个东西: 属性和方法

var zs = {
    name:‘zhangsan‘,
    birth:2000,
    //方法
    age:function(){
        //今年 - 出生的年
        var now = new Date().getFullyear();
        return now-this.birth;
    }
}
//属性
zhangsan.name
//方法,一定带	()
zhangsan.age()

this. 代表什么? 拆开上面的代码

function getAge(){
	    //今年 - 出生的年
        var now = new Date().getFullyear();
        return now-this.birth;
}
var zs= {
    name:‘zhangsan‘;
    birth:2020;
    age:getAge
}
//zs.age() ok
//getAge() NaN window 
    

apply

在js中可以控制this指向!

function getAge(){
	    //今年 - 出生的年
        var now = new Date().getFullyear();
        return now-this.birth;
}
var zs= {
    name:‘zhangsan‘;
    birth:2020;
    age:getAge
}
//zs.age() ok
getAge.apply(zs,[]);//this,指向了zs ,参数为空

json

json是什么

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在JS中 一切皆为对象,任何JS支持的类型都可以通过JSON来表示:

number,

string

。。。。

格式:

  • 对象都用{}
  • 数组都用[]
  • 所有的键值对 都是用key:value

JSON字符串 和JS 对象的转化

var user = {
    name : ”张三“,
    age : 3,
    sex:”男“
}
//对象转化为json字符串{name : ”张三“,age : 3,sex:”男“}
var jsonUser = JSON.stringify(user);

//json 字符串转化为对象,参数为json 字符串
var obj = JSON.parse(‘{name : ”张三“,age : 3,sex:”男“}‘)

JSON和JS 区别

var obj = {a:‘hello‘,b:‘hello‘};
var json = ‘{"a":"hello","b":"hello"}‘

以上是关于JS函数的主要内容,如果未能解决你的问题,请参考以下文章

几个关于js数组方法reduce的经典片段

web代码片段

JS常用代码片段-127个常用罗列-值得收藏

ES7-Es8 js代码片段

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

VSCode自定义代码片段——JS中的面向对象编程