JavaScript关于函数必须必须必须知到的基础

一、声明(两种方式)

第一种:function () { … }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量a,所以,通过变量a就可以调用该函数。
第二种:JavaScrpit中,函数也是一个对象,函数名f可以视为指向该函数的变量。

"use strict" //严格模式
var a = function () {      //第一种
    console.log('a');
}

function f() {       //第二种
    console.log('f');
}

a();
f();

结果会在控制台记录a和f两条日志
在这里插入图片描述

二、参数的多少和arguments

传入的参数多少和函数参数个数可以完全不一样.可多也可少,只需要按照顺序输入即可.

function f(x,y,z) {
    let s = '';
    for (let i = 0; i < arguments.length; i++) {
        s += arguments[i];
    }
    console.log("传入了"+arguments.length+"个参数:"+s)
}

f(1,2,3,4)
f(1,2,3);
f(1,2,);
f();

在这里插入图片描述

三、参数之rest

rest意思是剩余的,在声明函数的时候可以这样写
这样底层就会把多余的参数存在了rest中.
注意:就算没有多余的参数,rest是空不是undefined的

function f(a,b,…rest)

function f(a,b,...rest) {
    console.log("a:"+a+" b:"+b+" rest:"+rest);
}

f(1,2,3,4,);
f(1,2);

在这里插入图片描述

四、变量作用域

1) 变量提升

内部声明的变量会提前提到函数内部,在加载一个函数时,先加载这个函数里面所有声明的变量.所以写的时候最好在函数内部先声明所有的变量.这样就不会出错.
例子:

function a() {
    var x = 'Hello  '+y;
    console.log(x);

    var y = 'world';
}

a();

在这里输出的结果是 Hello undefined
原因就是在加载的时候加载出来是这个样子

function a() {
    var x = 'Hello  '+y;
    var y;  //这个时候是undefined
    console.log(x);
    var y = 'world';
}

所以它不会报错,当执行到console.log的时候还没有执行y = ‘world’;
所以输出出来时hello undefined.

2)全局作用域

不在任何函数内定义的变量就具有全局作用域,实际上,JavaScript默认有一个全局对象window.全局作用域的变量实际上被绑定到window的属性上.
比如:var a = ‘hello’ 调用alter(a)和alter(window.a)是一样的
再比如function f(x){} 调用f(x)和window.f(x)是一样的
还有alter()就是window.alter();
这说明JavaScript 只有一个全局作用域,每当函数内部调用变量时候,没有在当前作用域找到,就会向上查找,最终找到全局作用域,再没有找到就抛出ReferenceError错误

3)名字空间

全局变量会绑定到window对象上,如果有多个不同的JavaScript文件都使用了相同的全局变量,或者使用了相同名字的顶层函数,都会造成命名冲突,所以有了这么一项机制:名字空间

var MYWINDOWS = {};

MYWINDOWS.name = 'XXX'
MYWINDOWS.data = 1;

MYWINDOWS.f = function (x) {
    return 'f';
}

这样将MYWINDOWS当作唯一的一个全局变量,就不会与其他文件的全局变量混淆了.
在jQuery,YUI,underscore等等库中都使用过这项机制

四、解构赋值

1.可以用来多项赋值,将一个数组的元素分配给多个变量

var [x,y,z] = ['hello ','world ','!'];

console.log(x+y+z)

在这里插入图片描述
2.有嵌套的也可以

let [x,[y,z]] = ['hello ',['world ','!']];

console.log(x+y+z);

在这里插入图片描述
还可以忽略掉某些元素

let [,[y,z]] = ['hello ',['world ','!']];

console.log(y+z);

在这里插入图片描述
3.用于从一个对象中取出某些属性
如果变量不存在时候,就是undefined,
需要注意这时候用的是{},
如果{}里面的变量已经在全局变量声明过了,就要使用([x,y] = {1,2})这样写.因为JavaScript引擎把"{"开头的语句当成了块处理.

var person = {
    name : '小明',
    age : 20,
    address : {
        city : '北京',
        street : 'No.1'
    }
}

//这里name = 'x',可以给它赋默认值
var {name,address : {city}} = person;

console.log(name+"  "+city)

在这里插入图片描述

用处:

交换两个变量x和y的值,可以这么写,不再需要临时变量:
var x=1, y=2;
[x, y] = [y, x]

快速获取当前页面的域名和路径:
var {hostname:domain, pathname:path} = location;

可以用来快速创建一个对象.前提是这个函数接收对象作为参数.
function buildDate({year, month, day, hour=0, minute=0, second=0}) {
return new Date(year + ‘-’ + month + ‘-’ + day + ’ ’ + hour + ‘:’ + minute + ‘:’ + second);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值