console.log 本身也是一个函数
这个函数的作用是 向控制台输出内容
这个函数的返回值 是 undefined
这个函数fun()调用时,会执行console.log,向控制台输出123
函数fun 的返回值 是
function fun(){
// 功能是输出123到控制台,不是返回值
// console.log(123);
// 只有通过return关键词,定义的内容,才是返回值
// return 100;
// 此时直接return的是 console.log()的执行结果,
// 再次强调,console.log()打印的是功能,不是返回值不是执行结果
// console.log()的执行结果 undefined
return console.log(123);
}
fun();
var a = fun(); // 调用 fun()函数,将执行结果,也就是返回值赋值给a变量存储
console.log( a ); 即 console.log(fun()); → 123 undefined
function fun1 (){
return 100;
}
fun1; // fun1是函数名称,存储的是函数的内存地址
console.log(fun1); → 整个函数代码 // 如果输出,输出结果是,函数的内存地址,指向的代码内容
var a = fun1; // 赋值的是fun1中存储的内存地址
fun1(); // 调用fun1()函数,结果是return定义的返回值
console.log( fun1() ) → 100 // 输出的是函数的执行结果,也就是返回值
var b = fun1(); // 赋值的是fun1函数的执行结果,也就是返回值 100
function fun2 (){
return 100;
}
function fun3 (){
return 100;
}
console.log(fun2); → 整个函数代码
console.log(fun3); → 整个函数代码
console.log( fun2 == fun3 ); → false
虽然两个函数,程序内容是一样的,但是地址不同
执行结果就是false
记住
基本数据类型 比价的变量中存储的数值
复杂数据类型/引用数据类型 : 比较的是变量中存储的地址
复杂数据类型/引用数据类型,两个比较,一定是false
undefined 是一种数据类型,表示这个变量存在,但是没有被正确赋值
报错 XXX is not defined,表示这个变量不存在,没有找到
1,函数的预解析
所谓的预解析是将JavaScript程序 预读
找到关键词 var 和 function
在程序中给 var 定义变量,提前调用时,赋值undefined
在程序中给 function 定义的函数,提交调用时,赋值函数地址,可以正常调用
对于函数内部 程序的预解析 --- 只有在调用函数时才会预解析
函数内部的程序,以类似于字符串的形式存储在程序中的
在封装程序的过程中,没有执行程序,所有的程序内容都是字符串形式
JavaScript程序,不会解析函数中存储的内容
只有在调用执行函数时,JavaScript会将存储的函数的内容,解析为程序
此时会对函数中的程序代码,执行预解析
预解析的无下线
即是不会执行的程序,也会执行预解析
预解析,一般多用于函数的提前调用
偶尔会用于给变量赋值默认值
在之后的3阶段项目中,有从接口中调用数据,会用到预解析,是给变量赋默认值
2,作用域
全局作用域:在函数之外定义的变量
局部作用域:在函数之内定义的变量,参数
局部作用域变量,默认在函数外部是无法调用的,否则 会报错
之后会讲 闭包 可以调用函数内部的变量
调用:
优先调用当前作用域的变量
如果当前作用域没有,找父级作用域调用
都没有,报错
赋值:
优先赋值当前作用域变量
如果当前作用域没有,找父级作用域赋值
都没有,赋值语句,升级为定义变量语句,并且定义全局作用域变量
1,当你不熟悉函数的定义时,一定要按照我的步骤写函数
先写代码,实现效果
封装,将程序,写入函数{}中
定义参数
定义返回值
容错
默认值
函数说明
2,不是所有的函数都有参数和返回值
如果需要再定义,如果不需要,就不要定义
一般如果是直接输出内容,不需要定义 return 返回值
3,如何定义 return
return 作用 : 定义返回值
定义终止函数程序的执行
定义终止函数程序的执行 — 一般是处理容错时使用
return一般都是定义在if判断中
返回值是报错信息
定义返回值 — 是函数执行运算等的结果
return 的是存储结果的变量或者数据
此时一般都是写在程序的最后
4,如果没有定义 return 的函数,函数的执行结果,是undefined
// 这个函数的执行结果,返回值,是123,调用这个函数,会获得123的结果
function fun1(){
return 123;
}
var a = fun1(); 变量a中存储的是fun1()的执行结果,是123
console.log( fun1() ) ; 输出的也是fun1()的执行结果,是123
// 这个函数的功能是向页面输出123--不是返回值也不是执行结果
// 函数的执行结果,必须要使用return来定义
// 这个函数的执行结果,返回值,是没有定义的,是undefined
function fun2(){
console.log(123);
}
var b = fun2() ; // fun2()向控制台输出123,但是执行结果是undefined
// 变量b 存储的结果是 undefined
console.log( fun2() ) ; // 先控制台输出123 然后再输出fun2()的执行,也是undefined
5,函数的封装,没有固定的形式
console.log() document.write() return
所有的函数程序内容,都要根据功能需求来定义
你干什么,你就干什么,需要什么功能,你就写什么程序
var a=10; function fn(){ var a=20; console.log(a) } fn(); console.log(a)
结果是输出 20 10
var a=10; function fn(a){ a=20; console.log(a) } fn(a); console.log(a)
结果是输出 20 10
fn(); var fn = function(){ console.log("world") } → 报错(因为函数不能正常调用)
console.log(n); var fn = function(){ console.log("world") } → undefined
var a = 10;
// 这个函数有一个形参,也是a
// 形参也是函数中的变量
function fun(a){
a = 20; // 给形参a进行赋值,不是给全局a赋值
console.log(a); // 输出,调用的是,形参a,赋值了20之后的形参a
}
fun(a) // 20 是函数中的形参
console.log(a); // 10 是全局a,没有进行过任何操作,还是原始数值10
console.log(a); function a(){}; var a="hello"; → 函数 function a(){}
当function声明和var声明重名时,function生效,所以结果为
函数 function a(){}