函数 | |
| 将一系列代码或者操作行为打包到一起形成的就是函数,一块有特定功能的代码. 存放运行逻辑的代码块,以便重复使用 |
函数声明和函数表达式却别 | |
|
|
匿名函数-没有函数名(多结合事件和计时器) | |
|
|
实参跟形参 | |
| 形参:不需要声明,js可以识别,可以理解为已经默认声明过了 形参的目的是,模拟参数,安排参数参与函数内部的逻辑; |
| 实参:调用是传的参数; |
| 实参跟形参的赋值,遵守变量赋值原则
|
函数默认返回 | |
| 函数默认return undefind; |
函数声明(函数定义)
function functionName() {}
console.log(functionName); // functionName(){}
函数表达式
let fn = function () {};
具名函数(有名函数)
// 有名函数,可以直接通过函数名调用
function xx() {
console.log('么么哒');
}
xx();
let fn = function () {
console.log('不么么哒');
};
// 赋值给变量,变量接收函数,变量名即为函数名 因此也是有名函数 fn直接调用 fn()
匿名函数
// function(){} // 直接报错
// 由于没有名字的函数, 没有办法进行调用,所以它不能是单独的一条语句
// 更多的是配合别的语句使用,如赋值操作,或者存于数组 或者对象中,可以通过数组序号和对象属性调用
box.onclick = function () {};
let arr = [function () {}];
let json = { fn1: function () {} };
函数自执行
// 有名函数声明不能自执行,会报错,需要被调用
let fn = function () {
console.log('函数的执行');
};
fn(); // let 声明 先声明, 再使用
// function(){}()
// 匿名函数直接执行,js解释器会区别函数声明和函数表达式,当前语句是以function开头,
// 因此识别为 函数声明,函数声明必须带上函数名,因此直接报错 并且 函数声明也不能自执行
// 用括号全部包住,防止识别为函数声明,就可以自执行了
(function () {
console.log('自执行1');
})();
(function(){console.log(“自执行2")}())
let fn = (function () {
console.log(123);
})();
// fn(); // uncaught TypeError: fn is not a function
// 立即执行的函数表达式 函数名不能再次调用
函数的他执行(事件函数)
// 函数被其他东西触发,比如事件函数,函数通过等号赋值给事件的时候,称之为事件函数,触发事件使函数处触发,称之为 函数的他执行
IIFE 立即执行函数表达式
(function(){console.log("自执行1")}())
(function(){console.log("自执行2")})()
!function(){}()
+function(){}()
-function(){}()
~function(){}()
// 有条件的创建函数
// 函数可以被有条件来声明,这意味着,函数声明可能出现在一个 if 语句里,
// 但是,这种声明方式在不同的浏览器里可能有不同的效果。
// 因此,不应该在生成环境代码中使用这种声明方式,应该使用函数表达式来代替。
var hoisted = 'foo' in this;
console.log(`'foo' name ${hoisted ? 'is' : 'is not'} hoisted. typeof foo is ${typeof foo}`);
if (false) {
function foo() {
return 1;
}
}
// 在Chrome里:
// 'foo' 变量名被提升,但是 typeof foo 为 undefined
//
// 在Firefox里:
// 'foo' 变量名被提升. 但是 typeof foo 为 undefined
//
// 在Edge里:
// 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
//
// 在Safari里:
// 'foo' 变量名被提升. 而且 typeof foo 为 function
var hoisted = 'foo' in this;
console.log(`'foo' name ${hoisted ? 'is' : 'is not'} hoisted. typeof foo is ${typeof foo}`);
if (true) {
function foo() {
return 1;
}
}
// 在Chrome里:
// 'foo' 变量名被提升,但是 typeof foo 为 undefined
//
// 在Firefox里:
// 'foo' 变量名被提升. 但是 typeof foo 为 undefined
//
// 在Edge里:
// 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
//
// 在Safari里:
// 'foo' 变量名被提升. 而且 typeof foo 为 function
// 函数被提升
hoisted(); // "foo"
function hoisted() {
console.log('foo');
}
// 等价于
var hoisted;
hoisted = function () {
console.log('foo');
};
hoisted(); // "foo"
// 函数表达式不会被提升
notHoisted(); // TypeError: notHoisted is not a function
var notHoisted = function () {
console.log('bar');
};