JS08-函数的小问题总结

1, console.log()

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

2,函数的名称,和函数的调用

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

3, 两个函数的比较

function fun2 (){
    return 100;
}

function fun3 (){
    return 100;
}

console.log(fun2);    →   整个函数代码
console.log(fun3);    →   整个函数代码

console.log( fun2 == fun3 );   →  false

虽然两个函数,程序内容是一样的,但是地址不同
执行结果就是false

记住
基本数据类型 比价的变量中存储的数值
复杂数据类型/引用数据类型 : 比较的是变量中存储的地址
复杂数据类型/引用数据类型,两个比较,一定是false

4, undefined 和 报错的区别

undefined 是一种数据类型,表示这个变量存在,但是没有被正确赋值
报错 XXX is not defined,表示这个变量不存在,没有找到

5.函数的预解析和作用域

1,函数的预解析

所谓的预解析是将JavaScript程序 预读
        找到关键词 var 和 function
        在程序中给 var 定义变量,提前调用时,赋值undefined
        在程序中给 function 定义的函数,提交调用时,赋值函数地址,可以正常调用

        对于函数内部 程序的预解析 --- 只有在调用函数时才会预解析
            函数内部的程序,以类似于字符串的形式存储在程序中的
            在封装程序的过程中,没有执行程序,所有的程序内容都是字符串形式
            JavaScript程序,不会解析函数中存储的内容
            只有在调用执行函数时,JavaScript会将存储的函数的内容,解析为程序
            此时会对函数中的程序代码,执行预解析
        
        预解析的无下线
            即是不会执行的程序,也会执行预解析

    预解析,一般多用于函数的提前调用
          偶尔会用于给变量赋值默认值
          在之后的3阶段项目中,有从接口中调用数据,会用到预解析,是给变量赋默认值

2,作用域

全局作用域:在函数之外定义的变量

 局部作用域:在函数之内定义的变量,参数
        局部作用域变量,默认在函数外部是无法调用的,否则 会报错
        之后会讲 闭包 可以调用函数内部的变量
                  
  调用:
         优先调用当前作用域的变量
         如果当前作用域没有,找父级作用域调用
         都没有,报错

   赋值:
        优先赋值当前作用域变量
        如果当前作用域没有,找父级作用域赋值
         都没有,赋值语句,升级为定义变量语句,并且定义全局作用域变量

6.函数的总结

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

所有的函数程序内容,都要根据功能需求来定义
你干什么,你就干什么,需要什么功能,你就写什么程序

7.赋值和调用

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

8.提前调用var定义的函数

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

9.function声明和var声明重名

console.log(a); function a(){}; var a="hello";  →   函数 function a(){}

当function声明和var声明重名时,function生效,所以结果为
函数 function a(){}

你可能感兴趣的:(js,javascript)