【 总结 】函数作用域

本文深入探讨了JavaScript中的作用域规则,包括全局作用域和局部作用域,阐述了作用域链的概念以及如何从内向外查找变量。同时,详细讲解了变量声明提升和函数声明提升的现象,通过实例解析了代码执行的顺序。最后,通过一个小练习巩固了这些概念的应用。

作用域

		// 全局变量、全局作用域
        var a = 'apple'
        function fn(){
            // 局部变量、局部作用域
        	var a = "orange"
        	console.log(a) // orange
        }
        fn()
        console.log(a) // apple

作用域链

只能从里向外查找 最终找到全局 不能同级或者向下查找

		var a = "apple"
        var b = "orange"
        function fn(){
        	var a = 'banan'
        	// 此时内部定义了a 输出的是函数内部的a
        	console.log(a) // banan
        	// 函数内部没有定义 b 根据作用域链 向上查找 b = orange
        	console.log(b) // orange
        }
        fn()
        // 函数内部的 a 使用了var定义  所以并不影响全局的变量 a
        console.log(a) // apple

变量声明提升

		var a = "apple"
        function fn(){
        	// 声明提升
        	console.log(a) // undefined
        	var a = 'orange'
        	console.log(a) // orange
        // =====================================
        // 变量声明提升了 代码按照以下格式执行
            var a;
            console.log(a)
            a = 'orange'
            console.log(a)
        }
        fn()

函数声明提升

函数的提升会比变量 更加靠前

var a = "apple"
        function fn(){
        	// 声明提升
        	console.log(a) // undefined
        	var a = 'orange'
        	console.log(fns()) // orange
            function fns(){
            	return a
            }
        }
        fn()
        // ========================
        // 函数和变量发生了声明提升 代码就相当于是按照下列方式执行
        var a = "apple"
        function fn(){
            // 函数声明也会提升
        	function fns(){
        		return a
        	}
         
            var a;
        	console.log(a) // undefined
        	a = 'orange'
        	console.log(fns()) // orange
        }
        fn()

小练习

		var b = 'boy'
        console.log(b) // boy

        function fighting(){

        	console.log(a) // undefined
        	console.log(c) // undefined

            // 此时 a 只被定义 但是没有赋值  所以之前的a = undefined
        	if(a==='apple'){
        		a = 'Alice'
        	}else {
        		a = 'Ada'
        	}
        	// a = 'Ada'
        	
        	console.log(a) // Ada

            var a = 'Andy'

            middle();
            function middle(){
            	// 此时变量和函数声明提升
            	// var c; 但是c没有赋值 为定义的值进行运行 会得到NaN
            	console.log(c++) // NaN

            	// 此时c已经赋值 c = 100
            	var c = 100
            	console.log(++c) // 101
            	
            	small()
            	function small(){
            		// 通过作用域链 向上查找到 a = Andy
            		console.log(a) // Andy
            	}
            }
            
            // var c
            // c = 88
            // a = 88
            var c = a = 88

            function bottom(){
            	// this指向全局
            	console.log(this.b)  // boy

            	// 没有使用变量声明 所以是直接修改了全局变量下的值 
            	// 全局下的b = boy  此时修改了 b = baby 并且会影响全局的b的值
                b = 'baby'
                console.log(b) // baby
            }
            bottom()
        }

        fighting()
        console.log(b) // baby
根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值