函数的定义,作用域

118 阅读3分钟

返回值

返回值: 一个函数如果在执行完后, 需要返回一个数值, 这个值就是函数的返回值。
    函数的返回值通过return带回。
    函数必须有return,才有返回值
    function max(a, b) {
        var t = a > b ? a : b;
​
        return t;
    }
​
    var x = max(1, 2);
​
    console.log(x);
​
    一个函数允许拥有一个以上的return,遇到return则函数执行结束

函数的设计思想

围绕使用者的视角设计.
    返回值 = 函数名(参数列表);
    1.函数的功能
    2.函数是否需要参数
    3.函数是否需要返回值

函数的嵌套调用

函数的嵌套调用:一个函数在定义时,函数体内调用了其他的函数
主调函数 f1
被调函数 f2
function f1() {
    f2();
    console.log("f1");
}

函数定义时的另一种表现形式

函数定义的规则
a.
     function fun() {
         console.log("heihei");
     }   
    var x = 13;
    var str = "heihei";
b.
    函数本身也是一个对象
    var fun = function() {
        console.log("heihei");
    }
    fun();

事件与函数的关系

<!-- 方法一 -->
    <!-- <button onclick="f1()" onmouseover="f2()">点击</button> -->
    <button id="btn">点击</button>
事件: 用户用鼠标或者键盘操作网页时的某种发动作。
    系统先前定义好了很多动作行为
    onclick单击
    ondblclick双击
    onmouseover划入
    onmouseout划出
函数和事件的关系
    函数就是事件触发时执行的功能模块,可以理解为是通过某个动作调用了函数
     function fun() {
         console.log("heihei");
​
     fun()
----------------------------------------------------
函数和元素如何进行事件绑定
1.通过html元素的事件属性直接绑定
    var f1 = function() {
        console.log("heiheihei");
    
    function f2() {
        console.log("haha");
    
2.通过js实现事件和函数的绑定
    所有的HTML元素都可以转换成js对象
     document.getElementById("id名"):通过ID名获取html元素,返回该元素的js对象形式
    var oBtn = document.getElementById("btn");
    如何通过js对象操作该元素的属性
    js对象.属性名 = 属性值
    var f3 = function() {
        console.log("yingyingying");
    }
​
    oBtn.onclick = f3;
​
    oBtn.onmouseover = function() {
        console.log("xixi");
    }

js的编译及声明提升

源码-------------------------->计算机可执行代码
             编译
JS编译的方式为,边解释边执行,
编译一行,执行一行。
​
变量的声明提升:当遇到未被定义而直接使用的变量时,系统会偷偷的在该作用域首行
对该变量进行定义,且赋值为undefined
​
var a = undefined;
a = 123;
var a;
console.log(a);

变量的作用域

变量的作用域:作用域指变量能够使用的范围
    var i = 123;
    function fun() {
        console.log(i);
    }
    i = 666;
    fun();
    function fun() {
        var i = 999;
    }
    console.log(i);
----------------------------------------------
全局变量: 定义时没有被任何括号括起来的变量, 作用域为整个页面
    1.全局变量可以在整个页面间共享传递数据
    2.全局变量的生命周期和页面相同,大量使用全局变量可能会造成内存问题
    3.大量使用全局变量,会降低函数的独立性
    4.通常全局变量在事件绑定的函数中使用
        var i = 123;   
        function fun() {
            i = 999;
            console.log(i);
        }
        fun();
        console.log(i);
​
局部变量
    1.被任何括号括起来的变量,作用域为函数的{}之间
        function fun(a) {
            var b = 66;
        }
​
        console.log(b); //错误
​
疑惑:如何在函数体外使用函数的局部变量?
1.传参
    function f1() {
        var a = 123;
        f2(a); //将a作为f2的参数
    }
​
    function f2(x) {
​
    }
​
2.返回值
    function f1() {
        var a = 123;
​
        return a;
    }
​
    var x = f1();
​
----------------------------------------------

作用域链

作用域链:js允许函数嵌套定义函数
在函数嵌套定义中,各种变量的作用域关系
    function f1(a) {
        var b = 2;
子函数可以使用父函数变量
    var f2 = function(c) {
        var d = 4;
        console.log(a, b, c, d);
    }
    f2(3);
父函数不能使用子函数的内部变量
         console.log(d);错误
    }
​
    f1(1);