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"}‘