精华内容
下载资源
问答
  • Python10行以内代码有什么高端操作

    万次阅读 多人点赞 2020-03-30 16:01:14
    Python10行以内代码有什么高端操作

    Python10行以内代码能有什么高端操作

    Python凭借其简洁的代码,赢得了许多开发者的喜爱。因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代码实现许多有趣的操作。下面我们来看看,我们用不超过10行代码能实现些什么有趣的功能。

    一、生成二维码

    二维码作为一种信息传递的工具,在当今社会发挥了重要作用。而生成一个二维码也非常简单,在Python中我们可以通过MyQR模块了生成二维码,而生成一个二维码我们只需要2行代码,我们先安装MyQR模块,这里选用国内的源下载:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ myqr
    

    安装完成后我们就可以开始写代码了:

    from MyQR import myqr	# 注意大小写
    myqr.run(words='http://www.baidu.com')	# 如果为网站则会自动跳转,文本直接显示,不支持中文
    

    我们执行代码后会在项目下生成一张二维码。当然我们还可以丰富二维码:

    from MyQR import myqr
    myqr.run(
        words='http://www.baidu.com',	# 包含信息
        picture='lbxx.jpg',			# 背景图片
        colorized=True,			# 是否有颜色,如果为False则为黑白
        save_name='code.png'	# 输出文件名
    )
    

    效果图如下:
    在这里插入图片描述
    另外MyQR还支持动态图片。

    二、生成词云

    词云是数据可视化的一种非常优美的方式,我们通过词云可以很直观的看出一些词语出现的频率高低。使用Python我们可以通过wordcloud模块生成词云,我们先安装wordcloud模块:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ wordcloud
    

    然后我们就可以写代码了:

    from wordcloud import WordCloud
    wc = WordCloud()	# 创建词云对象
    wc.generate('Do not go gentle into that good night')	# 生成词云
    wc.to_file('wc.png')	# 保存词云
    

    执行代码后生成如下词云:在这里插入图片描述
    当然这只是最简单的词云,词云更详细的操作可以参见WordCloud生成卡卡西忍术词云

    三、批量抠图

    抠图的实现需要借助百度飞桨的深度学习工具paddlepaddle,我们需要安装两个模块就可以很快的实现批量抠图了,第一个是PaddlePaddle:

    python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
    

    还有一个是paddlehub模型库:

    pip install -i https://mirror.baidu.com/pypi/simple paddlehub
    

    更详细的安装事项可以参见飞桨官网:https://www.paddlepaddle.org.cn/

    接下来我们只需要5行代码就能实现批量抠图:

    import os, paddlehub as hub
    humanseg = hub.Module(name='deeplabv3p_xception65_humanseg')		# 加载模型
    path = 'D:/CodeField/Workplace/PythonWorkplace/GrapImage/'	# 文件目录
    files = [path + i for i in os.listdir(path)]	# 获取文件列表
    results = humanseg.segmentation(data={'image':files})	# 抠图
    

    抠图效果如下:

    其中左边为原图,右边为抠图后填充黄色背景图。

    四、文字情绪识别

    在paddlepaddle面前,自然语言处理也变得非常简单。实现文字情绪识别我们同样需要安装PaddlePaddle和Paddlehub,具体安装参见中内容。然后就是我们的代码部分了:

    import paddlehub as hub		
    senta = hub.Module(name='senta_lstm')		# 加载模型
    sentence = [	# 准备要识别的语句
        '你真美', '你真丑', '我好难过', '我不开心', '这个游戏好好玩', '什么垃圾游戏',
    ]
    results = senta.sentiment_classify(data={"text":sentence})	# 情绪识别
    # 输出识别结果
    for result in results:
        print(result)
    

    识别的结果是一个字典列表:

    {'text': '你真美', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9602, 'negative_probs': 0.0398}
    {'text': '你真丑', 'sentiment_label': 0, 'sentiment_key': 'negative', 'positive_probs': 0.0033, 'negative_probs': 0.9967}
    {'text': '我好难过', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.5324, 'negative_probs': 0.4676}
    {'text': '我不开心', 'sentiment_label': 0, 'sentiment_key': 'negative', 'positive_probs': 0.1936, 'negative_probs': 0.8064}
    {'text': '这个游戏好好玩', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9933, 'negative_probs': 0.0067}
    {'text': '什么垃圾游戏', 'sentiment_label': 0, 'sentiment_key': 'negative', 'positive_probs': 0.0108, 'negative_probs': 0.9892}
    

    其中sentiment_key字段包含了情绪信息,详细分析可以参见Python自然语言处理只需要5行代码

    五、识别是否带了口罩

    这里同样是使用PaddlePaddle的产品,我们按照上面步骤安装好PaddlePaddle和Paddlehub,然后就开始写代码:

    import paddlehub as hub
    # 加载模型
    module = hub.Module(name='pyramidbox_lite_mobile_mask')
    # 图片列表
    image_list = ['face.jpg']
    # 获取图片字典
    input_dict = {'image':image_list}
    # 检测是否带了口罩
    module.face_detection(data=input_dict)
    

    执行上述程序后,项目下会生成detection_result文件夹,识别结果都会在里面,识别效果如下:
    在这里插入图片描述

    六、简易信息轰炸

    Python控制输入设备的方式有很多种,我们可以通过win32或者pynput模块。我们可以通过简单的循环操作来达到信息轰炸的效果,这里以pynput为例,我们需要先安装模块:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pynput
    

    在写代码之前我们需要手动获取输入框的坐标:

    from pynput import mouse
    # 创建一个鼠标
    m_mouse = mouse.Controller()
    # 输出鼠标位置
    print(m_mouse.position)
    

    可能有更高效的方法,但是我不会。

    获取后我们就可以记录这个坐标,消息窗口不要移动。然后我们执行下列代码并将窗口切换至消息页面:

    import time
    from pynput import mouse, keyboard
    time.sleep(5)
    m_mouse = mouse.Controller()    # 创建一个鼠标
    m_keyboard = keyboard.Controller()  # 创建一个键盘
    m_mouse.position = (850, 670)       # 将鼠标移动到指定位置
    m_mouse.click(mouse.Button.left) # 点击鼠标左键
    while(True):
        m_keyboard.type('你好')		# 打字
        m_keyboard.press(keyboard.Key.enter)	# 按下enter
        m_keyboard.release(keyboard.Key.enter)	# 松开enter
        time.sleep(0.5)	# 等待 0.5秒
    

    我承认,这个超过了10行代码,而且也不高端。使用前QQ给小号发信息效果如下:
    在这里插入图片描述

    七、识别图片中的文字

    我们可以通过Tesseract来识别图片中的文字,在Python中实现起来非常简单,但是前期下载文件、配置环境变量等稍微有些繁琐,所以本文只展示代码:

    import pytesseract
    from PIL import Image
    img = Image.open('text.jpg')
    text = pytesseract.image_to_string(img)
    print(text)
    

    其中text就是识别出来的文本。如果对准确率不满意的话,还可以使用百度的通用文字接口。

    八、绘制函数图像

    图标是数据可视化的重要工具,在Python中matplotlib在数据可视化中发挥重要作用,下面我们来看看使用matplotlib如何绘制一个函数图像:

    import numpy as np 
    from matplotlib import pyplot as plt 
     
    x = np.arange(1,11) 	# x轴数据
    y =  x * x +  5 		# 函数关系
    plt.title("y=x*x+5") 	# 图像标题
    plt.xlabel("x") 	# x轴标签
    plt.ylabel("y") 	# y轴标签
    plt.plot(x,y) 	# 生成图像
    plt.show()	# 显示图像
    

    生成图像如下:
    在这里插入图片描述

    九、人工智能

    下面给大家介绍的是独家的AI人工智能,一般不外传的。这个人工智能可以回答许多问题,当然人工智能现在还在发展阶段,想要理解人类的语言还差很多。废话不多说,下面来看看我们的人工智能Fdj:

    while(True):
        question = input()
        answer = question.replace('吗', '呢')
        answer = answer.replace('?', '!')
        print(answer)
    

    下面我们来看看简单的测试:

    你好吗?
    我好呢!
    你吃饭了吗?
    我吃饭了呢!
    你要睡了吗?
    我要睡了呢!
    

    最后送大家一套2020最有趣的Pyhon项目实战视频教程,点击此处 进来获取 跟着练习下,希望大家一起进步哦!
    看来我们“小复”还是比较智能的。

    展开全文
  • 代码整洁 vs 代码肮脏

    万次阅读 多人点赞 2019-09-16 12:05:12
    《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。 WTF/min是衡量代码质量的唯一标准,Uncle Bob在书中称糟糕的代码为沼泽...

    写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。

    WTF/min是衡量代码质量的唯一标准,Uncle Bob在书中称糟糕的代码为沼泽(wading),这只突出了我们是糟糕代码的受害者。国内有一个更适合的词汇:屎山,虽然不是很文雅但是更加客观,程序员既是受害者也是加害者。

    对于什么是整洁的代码,书中给出了大师们的总结:

    • Bjarne Stroustrup:优雅且高效;直截了当;减少依赖;只做好一件事
    • Grady booch:简单直接
    • Dave thomas:可读,可维护,单元测试
    • Ron Jeffries:不要重复、单一职责,表达力(Expressiveness)

    其中,我最喜欢的是表达力(Expressiveness)这个描述,这个词似乎道出了好代码的真谛:用简单直接的方式描绘出代码的功能,不多也不少。

    本文记录阅读《clean code》之后个人“深有同感”或者“醍醐灌顶”的一些观点。

    一、命名的艺术

    坦白的说,命名是一件困难的事情,要想出一个恰到好处的命名需要一番功夫,尤其我们的母语还不是编程语言所通用的英语。不过这一切都是值得了,好的命名让你的代码更直观,更有表达力。

    好的命名应该有下面的特征:

    1.1 名副其实

    好的变量名告诉你:是什么东西,为什么存在,该怎么使用

    如果需要通过注释来解释变量,那么就先得不那么名副其实了。

    下面是书中的一个示例代码,展示了命名对代码质量的提升

    # bad code
    def getItem(theList):
       ret = []
       for x in theList:
          if x[0] == 4:
             ret.append(x)
       return ret
    
    # good code
    def getFlaggedCell(gameBoard):
       '''扫雷游戏,flagged: 翻转'''
       flaggedCells = []
       for cell in gameBoard:
          if cell.IsFlagged():
             flaggedCells.append(cell)
       return flaggedCells
    

    1.2 避免误导

    • 不要挂羊头卖狗肉
    • 不要覆盖惯用缩略语

    这里不得不吐槽前两天才看到的一份代码,居然使用了 l 作为变量名;而且,user居然是一个list(单复数都没学好!!)

    1.3 有意义的区分

    代码是写给机器执行,也是给人阅读的,所以概念一定要有区分度。

    # bad
    def copy(a_list, b_list):
        pass
    
    # good
    def copy(source, destination):
        pass
    

    1.4 使用读的出来的单词

    如果名称读不出来,那么讨论的时候就会像个傻鸟

    1.5 使用方便搜索的命名

    名字长短应与其作用域大小相对应

    1.6 避免思维映射

    比如在代码中写一个temp,那么读者就得每次看到这个单词的时候翻译成其真正的意义

    二、注释

    有表达力的代码是无需注释的:The proper use of comments is to compensate for our failure to express ourself in code.

    注释的适当作用在于弥补我们用代码表达意图时遇到的失败,这听起来让人沮丧,但事实确实如此。The truth is in the code, 注释只是二手信息,二者的不同步或者不等价是注释的最大问题。

    书中给出了一个非常形象的例子来展示:用代码来阐述,而非注释

    bad
    // check to see if the employee is eligible for full benefit
    if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
    
    good
    if (employee.isEligibleForFullBenefits())
    

    因此,当想要添加注释的时候,可以想想是否可以通过修改命名,或者修改函数(代码)的抽象层级来展示代码的意图。

    当然,也不能因噎废食,书中指出了以下一些情况属于好的注释

    • 法务信息
    • 对意图的注释,为什么要这么做
    • 警示
    • TODO注释
    • 放大看似不合理之物的重要性

    其中个人最赞同的是第2点和第5点,做什么很容易通过命名表达,但为什么要这么做则并不直观,特别涉及到专业知识、算法的时候。另外,有些第一感觉“不那么优雅”的代码,也许有其特殊愿意,那么这样的代码就应该加上注释,说明为什么要这样,比如为了提升关键路径的性能,可能会牺牲部分代码的可读性。

    最坏的注释就是过时或者错误的注释,这对于代码的维护者(也许就是几个月后的自己)是巨大的伤害,可惜除了code review,并没有简单易行的方法来保证代码与注释的同步。

    三、函数

    3.1 函数的单一职责

    一个函数应该只做一件事,这件事应该能通过函数名就能清晰的展示。判断方法很简单:看看函数是否还能再拆出一个函数。

    函数要么做什么do_sth, 要么查询什么query_sth。最恶心的就是函数名表示只会query_sth, 但事实上却会do_sth, 这使得函数产生了副作用。比如书中的例子

    public class UserValidator {
        private Cryptographer cryptographer;
        public boolean checkPassword(String userName, String password) {
            User user = UserGateway.findByName(userName);
            if (user != User.NULL) {
                String codedPhrase = user.getPhraseEncodedByPassword();
                String phrase = cryptographer.decrypt(codedPhrase, password);
                if ("Valid Password".equals(phrase)) {
                    Session.initialize();
                    return true;
                }
            }
            return false;
        }
    }
    

    3.2 函数的抽象层级

    每个函数一个抽象层次,函数中的语句都要在同一个抽象层级,不同的抽象层级不能放在一起。比如我们想把大象放进冰箱,应该是这个样子的:

    def pushElephantIntoRefrige():
        openRefrige()
        pushElephant()
        closeRefrige()
    

    函数里面的三句代码在同一个层级(高度)描述了要完成把大象放进冰箱这件事顺序相关的三个步骤。显然,pushElephant这个步骤又可能包含很多子步骤,但是在pushElephantIntoRefrige这个层级,是无需知道太多细节的。

    当我们想通过阅读代码的方式来了解一个新的项目时,一般都是采取广度优先的策略,自上而下的阅读代码,先了解整体结构,然后再深入感兴趣的细节。如果没有对实现细节进行良好的抽象(并凝练出一个名副其实的函数),那么阅读者就容易迷失在细节的汪洋里。

    某种程度看来,这个跟金字塔原理也很像
    file

    每一个层级都是为了论证其上一层级的观点,同时也需要下一层级的支持;同一层级之间的多个论点又需要以某种逻辑关系排序。pushElephantIntoRefrige就是中心论点,需要多个子步骤的支持,同时这些子步骤之间也有逻辑先后顺序。

    3.3 函数参数

    函数的参数越多,组合出的输入情况就愈多,需要的测试用例也就越多,也就越容易出问题。

    输出参数相比返回值难以理解,这点深有同感,输出参数实在是很不直观。从函数调用者的角度,一眼就能看出返回值,而很难识别输出参数。输出参数通常逼迫调用者去检查函数签名,这个实在不友好。

    向函数传入Boolean(书中称之为 Flag Argument)通常不是好主意。尤其是传入True or False后的行为并不是一件事情的两面,而是两件不同的事情时。这很明显违背了函数的单一职责约束,解决办法很简单,那就是用两个函数。

    3.4 Dont repear yourself

    在函数这个层级,是最容易、最直观实现复用的,很多IDE也难帮助我们讲一段代码重构出一个函数。

    不过在实践中,也会出现这样一种情况:一段代码在多个方法中都有使用,但是又不完全一样,如果抽象成一个通用函数,那么就需要加参数、加if else区别。这样就有点尴尬,貌似可以重构,但又不是很完美。

    造成上述问题的某种情况是因为,这段代码也违背了单一职责原则,做了不只一件事情,这才导致不好复用,解决办法是进行方法的细分,才能更好复用。也可以考虑template method来处理差异的部分。

    四、测试

    非常惭愧的是,在我经历的项目中,测试(尤其是单元测试)一直都没有得到足够的重视,也没有试行过TDD。正因为缺失,才更感良好测试的珍贵。

    我们常说,好的代码需要有可读性、可维护性、可扩展性,好的代码、架构需要不停的重构、迭代,但自动化测试是保证这一切的基础,没有高覆盖率的、自动化的单元测试、回归测试,谁都不敢去修改代码,只能任其腐烂。

    即使针对核心模块写了单元测试,一般也很随意,认为这只是测试代码,配不上生产代码的地位,以为只要能跑通就行了。这就导致测试代码的可读性、可维护性非常差,然后导致测试代码很难跟随生产代码一起更新、演化,最后导致测试代码失效。所以说,脏测试 - 等同于 - 没测试。

    因此,测试代码的三要素:可读性,可读性,可读性。

    对于测试的原则、准则如下:

    • You are not allowed to write any production code unless it is to make a failing unit test pass. 没有测试之前不要写任何功能代码
    • You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. 只编写恰好能够体现一个失败情况的测试代码
    • You are not allowed to write any more production code than is sufficient to pass the one failing unit test. 只编写恰好能通过测试的功能代码

    测试的FIRST准则:

    • 快速(Fast)测试应该够快,尽量自动化。
    • 独立(Independent) 测试应该应该独立。不要相互依赖
    • 可重复(Repeatable) 测试应该在任何环境上都能重复通过。
    • 自我验证(Self-Validating) 测试应该有bool输出。不要通过查看日志这种低效率方式来判断测试是否通过
    • 及时(Timely) 测试应该及时编写,在其对应的生产代码之前编写

    该文章通过 https://openwrite.cn/ 工具创造并群发。

    展开全文
  • JAVA静态代码块的作用

    千次阅读 2018-03-29 17:09:57
    一 般情况下,如果有些代码... 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.区别很简单...
    一 般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情 况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用
    比如main方法就必须是静态的 这是程序入口
    两者的区别就是:静态代码块是自动执行的;
    静态方法是被调用的时候才执行的.
    区别很简单:
    静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
    非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
    相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
        一般在代码块中对一些static变量进行赋值。
    不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
        静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new
        一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
    例:
    //普通类
    public class PuTong {
    public PuTong(){
    System.out.print("默认构造方法!-->");
    }

    //非静态代码块
    {
    System.out.print("非静态代码块!-->");
    }

    //静态代码块
    static{
    System.out.print("静态代码块!-->");
    }

    public static void test(){
    {
    System.out.println("普通方法中的代码块!");
    }
    }
    }

    //测试类
    public class TestClass {

    /**
    * 区别两次new静态与非静态代码块执行情况
    */
    public static void main(String[] args) {
    PuTong c1 = new PuTong();
    c1.test();

    PuTong c2 = new PuTong();
    c2.test();
    }
    }

    /*
    运行输出结果是:
    静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!
    非静态代码块!-->默认构造方法!-->普通方法中的代码块!
    */
    继承的时候:
    
    
    分析:对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。 
    而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
    展开全文
  • 作用域 本篇主要总结了作用域的定义、作用域和作用域链的规则,全局变量和局部变量的关系,利用思维导图代替纯文字描述,提高收获,加油!

    作用域

    作用域的篇幅不会太长,作为自己对Js总结的第三篇文章,主要是承上启下。
    之后会涉及到执行上下文,闭包等相关专题,为了避免内容过多,作用域这一部分单独总结。

    目录

    前言

    在这里插入图片描述

    JavaScript内功系列:

    1. this指向详解,思维脑图与代码的结合,让你一篇搞懂this、call、apply。系列(一)
    2. 从原型到原型链,修炼JavaScript内功这篇文章真的不能错过!系列(二)
    3. 本文

    一、作用域的定义

    一张导图概括本节内容

    在这里插入图片描述

    注意:除了作用域,在此送大家2020最新企业级 Vue3.0/Js/ES6/TS/React/Node等实战视频教程,点击此处免费获取,小白勿进哦

    1.1 常见的解释

    1. 一段程序代码中所用到的名字并不总是有效,而限定它的可用性的范围就是这个名字的作用域;
    2. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限;
    3. 通俗的讲作用域就是一套规则,用于确定在何处以及如何查找某个变量的规则
    function func(){
    	var a = 100;
    	console.log(a); // 100
    }
    console.log(a) // a is not defined a变量并不是任何地方都可以被找到的
    

    1.2 JavaScript中作用域工作模型

    JavaScript 采用是词法作用域(lexical scoping),也就是静态作用域:

    • 函数的作用域在函数定义的时候就决定了

    与之对应的还有一个动态作用域:

    • 函数的作用域是在函数调用的时候才决定的;

    1.3 全局变量和局部变量

    根据定义变量的方式又可以分为:

    局部变量:只能在函数中访问,该函数外不可访问;

    • 定义在函数中的变量
    function fn(){
    	var name = '余光';
    	console.log(name);
    }
    console.log(name); // ?
    fn(); // ?
    

    全局:任何地方都能访问到的对象拥有全局作用域。

    • 函数外定义的变量
    • 所有末定义直接赋值的变量自动声明为拥有全局作用域
    var a = 100;
    console.log('a1-',a);
    
    function fn(){
    	a = 1000;
    	console.log('a2-',a);
    }
    console.log('a3-',a);
    fn();
    console.log('a4-',a);
    

    注意:在ES6之后又提出了块级作用域,它们之间的区别我们之后再来讨论。

    在这里插入图片描述

    二、理解作用域

    根据第一节的描述,我们一一验证一下

    2.1 理解词法作用域

    var value = 1;
    function foo() {
        console.log(value);
    }
    function bar() {
        var value = 2;
        foo();
    }
    bar();
    

    我们结合定义去分析:

    • 执行bar函数,函数内部形成了局部作用域;
    • 声明value变量,并赋值2
    • 执行foo函数,函数foo的作用域内没有value这个变量,它会向外查找
    • 根据词法作用域的规则,函数定义时,foo的外部作用域为全局作用域
    • 打印结果是1

    如果是动态作用域的话:结果就是2,不知道你是否想明白了?

    2.2 全局变量

    var str = '全局变量';
    function func(){
    	console.log(str+1);
    	function childFn(){
    		console.log(str+2);
    		function fn(){
    			console.log(str+3);
    		};
    		fn();
    	};
    	childFn();
    }
    func();
    // 全局变量1
    // 全局变量2
    // 全局变量3
    

    再来分析下面的代码:

    var a = 100;
    function fn(){
    	a = 1000;
    	console.log('a1-',a);
    }
    console.log('a2-',a);
    fn();
    console.log('a3-',a);
    // a2- 100 // 在当前作用域下查找变量a => 100
    // a1- 1000 // 函数执行时,全局变量a已经被重新赋值
    // a3- 1000 // 全局变量a => 1000
    

    2.3 局部作用域

    局部作用域一般只在固定的代码片段内可访问到,最常见的就是以函数为单位的:

    function fn(){
        var name="余光";
        function childFn(){
            console.log(name);
        }
        childFn(); // 余光
    }
    console.log(name); // name is not defined
    

    三、作用域链

    3.1 当查找变量的时候都发生了什么?

    • 会先从当前上下文的变量对象中查找;
    • 如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找;
    • 一直找到全局上下文的变量对象,也就是全局对象;
    • 作用域链的顶端就是全局对象;

    这样由多个执行上下文的变量对象构成的链表就叫做作用域链,从某种意义上很类似原型和原型链。

    3.2 作用域链和原型继承查找时的区别:

    • 查找一个普通对象的属性,但是在当前对象和其原型中都找不到时,会返回undefined
    • 查找的属性在作用域链中不存在的话就会抛出ReferenceError

    3.3 作用域嵌套

    既然每一个函数就可以形成一个作用域(词法作用域 || 块级作用域),那么当然也会存在多个作用域嵌套的情况,他们遵循这样的查询规则:

    • 内部作用域有权访问外部作用域;
    • 外部作用域无法访问内部作用域;(真是是这样吗?)
    • 兄弟作用域不可互相访问;

    在《你不知道的Js》中,希望读者可以将作用域的嵌套和作用域链想象成这样:

    在这里插入图片描述

    四、思考与总结

    4.1 总结

    在这里插入图片描述

    4.2 思考

    最后,让我们看一个《JavaScript权威指南》中的两段代码:

    var scope = "global scope";
    function checkscope1(){
        var scope = "local scope";
        function f(){
            return scope;
        }
        return f(); // 注意
    }
    checkscope1();
    
    var scope = "global scope";
    function checkscope2(){
        var scope = "local scope";
        function f(){
            return scope;
        }
        return f;
    }
    checkscope2()();
    

    两段代码的结果都是"local scope",书中的回答是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

    但是它们内部经历的事情是一样的吗?

    参考

    写在最后

    JavaScript内功基础部分已经总结到第三篇了,本系列大约会有15篇文章,都是我们在面试最高频的,但工作中常常被忽略的。

    JavaScript内功系列:

    1. this指向详解,思维脑图与代码的结合,让你一篇搞懂this、call、apply。系列(一)
    2. 从原型到原型链,修炼JavaScript内功这篇文章真的不能错过!系列(二)
    3. 本文
    4. 下一篇预发:执行上下文

    关于我

    • 花名:余光
    • 沉迷JS,水平有限,虚心学习中

    其他沉淀

    如果您看到了最后,不妨收藏、点赞、评论一下吧!!!
    持续更新,您的三连就是我最大的动力,虚心接受大佬们的批评和指点,共勉!

    展开全文
  • Faster RCNN算法解析(附源代码,可以直接运行)

    万次阅读 多人点赞 2018-05-30 15:22:48
    一、前言知识 1、基于Region Proposal(候选区域)的深度学习目标检测算法 Region Proposal(候选区域),就是预先找出图中目标可能出现的位置,通过利用图像中的纹理、...2、什么是IoU? Intersection over Un...
  • 【java】java构造代码块的作用{}

    千次阅读 2018-09-23 13:46:07
    构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。 package test922; public class ...
  • 技术文中直接执行代码,我实现了

    千次阅读 热门讨论 2020-11-14 10:38:51
    最近给网站做了个「代码执行器」,主题我直接抄了Xcode 的主题,现在代码终于可以在浏览器里实时看到运行效果了。效果如下:还可以进行全屏编辑代码:以后看技术文章可以这样看:人可能会问,...
  • 什么我的js代码不起作用了?function { ... }中的代码无效,直接onClick=" ... "又管用了,难道window.alert("")也会错?挠了半天的脑袋,其实很可能因为格式不对喔 type="text/JavaScript"> ...//--> &...
  • java 理解static代码块的作用

    千次阅读 2014-11-12 12:05:04
    使用static静态代码块进行初始化与直接在定义变量的时候初始化效果是一样的,但是它们的先后顺序可能会对变量的值造成影响。 示例: public class TestStatic {  public static int a = 1;  
  • Sonar在检查java代码隐患中的作用

    千次阅读 2013-05-26 22:21:58
    Sonar作为一个非常实用的代码质量检查工具,可以在各个维度...关于sonar的安装和使用在本博的另一篇文章(《代码质量检查工具Sonar结合hudson、maven使用》)详细描述 本文主要介绍sonar能够检查出的代码
  • Java基础(各种代码块的作用和区别)

    千次阅读 2019-06-21 16:04:44
    代码块概述 在Java中,使用{}大括号括起来的代码被称为代码块。 根据其位置和声明的不同,代码块可以分为: ...在类中直接定义没有任何修饰符、前缀、后缀的代码块即为构造代码块。 特点: ...
  • 原帖地址:http://topic.csdn.net/u/20091104/12/1f724e60-117f-485f-9f87-4a8c7679ab55.html?24151 ... 2、选择了编译为本机代码后,可以设置一些选项,比如:代码优化速度、代码大小优化、无优化等,它们分别有什么
  • java中静态代码块的作用

    千次阅读 2016-04-12 21:48:04
    static静态代码块 : public class Static { //这里是什么意思呀 怎么static 还可以这样用呀? static { int i=5; } static int i,j; public static void main(String[] args) { i–; method();
  • 属性、方法、代码块 1)静态变量特点 所有对象共享 在类被载入时创建,只要类存在,static变量就存在 两种方式访问: 直接访问:类名.属性; 实例化后访问:对象名.属性; 2)静态方法特点: 不需要实例化,可以直接...
  • 这个代码作用就是如果没有来源的话就无法正常访问,来源才可以正常访问,也就是禁止直接输入网址访问的意思。 ASP代码如下: JS代码如下:
  • 什么是整洁的代码

    千次阅读 多人点赞 2019-09-18 12:17:34
    作者 | xybaby来源 | https://www.cnblogs.com/xybaby/p/11335829.html写出整洁的代码,是每个程序员的追求。《clea...
  • 各个发行版的linux内核都是一样的,但是为什么很多软件、库(例如OpenCV)安装的时候都需要在本地编译源码,产生二进制代码然后运行,而不是直接发布二进制代码? 因为不同的发行版乃至不同的版本库不同 而应用...
  • 发现 PHP代码错误,nginx直接返回500错误 修改文件的思路。 首先问题肯定是在PHP的配置模块 PHP的配置文件php.ini 和 php-fpm.conf 这两个文件在 /user/local/php7/etc/ 目录下。 之前一直修改的是 /etc/...
  • uwsgi --reload uwsgi.pid 其中uwsgi.pid是进程的pid文件[通过 ps aux | uwsgi 找到uwsgi对应的pid, 然后直接uwsgi --reload 进程对应的文件名]
  • 在页面中直接嵌入JavaScript代码

    千次阅读 2017-04-12 10:30:44
    在HTML文档中通过使用标记将JavaScript脚本嵌入到其中,在HTML文档中可以使用多个标记,每个标记中可以包含多个JavaScript的代码集合。 script标记属性说明 属性 说明 language 设置所使用的脚本语言...
  • 今天微软一站式示例代码库团队发布了示例代码浏览器的Visual Studio 扩展。了它,开发人员就可以在Visual Studio 2010里直接通过Alt+F1快捷键搜索示例代码,并方便地对示例代码进行下载和管理。 你可以在 ...
  • 在网页中直接播放已审批过的视频,可以复制视频下方的分享链接:如我直接插入一段嵌入链接: <iframe src="//player.bilibili.com/player.html?aid=11267507&cid=20137217&page=1" scrolling="no" ...
  • 面试|static 关键字有什么作用

    万次阅读 多人点赞 2019-06-16 12:43:01
    今天主要学习下Java语言中的static关键字。 static关键字的含义及使用场景 ...(注意:不能修饰普通类,除了内部类,这是为什么?) class A { static { System.out.println("A : 静态代码块"); ...
  • java 延迟执行代码(定时作用

    万次阅读 2013-08-21 10:48:33
    间隔某段时间之后,再去执行某段代码,实现这种结果两种方式: 1)使用Sleep方法,就是去新建一个线程,然后里边放一个Thread.sleep()方法,这也是比较通俗的做法。 new Thread(){ public void run(){ try { ...
  • 直接代码,编译环境VIsual C++ /****************************************************  头文件声明 ----------------------------------------------------*/ #include /********************************...
  • android代码混淆之微信分享不起作用

    千次阅读 2015-06-16 11:45:04
    很多第三方sdk为了在项目混淆...如果你加上下面这段代码那么蛋疼的时候就来了,我看很多开发者因为这件事在网上直接说微信分享就是垃圾。微信提供的是这句。 -keep class com.tencent.mm.sdk.openapi.WXMediaMessa
  • matlab中双百分号%%的作用代码分块运行

    万次阅读 多人点赞 2017-10-24 15:44:03
    在参考别人的matlab程序中,时候会看到两个百分号一起...那是因为,%%在matlab代码中的作用是将代码分块,上下两个%%之间的部分作为一块,在运行代码的时候可以分块运行,查看每一块代码的运行情况。常用于调试程序。
  • 什么是网站的统计代码

    千次阅读 2019-08-05 22:04:40
    1、什么是统计代码,它包含的种类哪些?作用什么? 引言:一般网站做好了站长希望知道一天多少人访问,通过哪些关键词来自己的网站等等 网站统计:是指通过专业的网站统计分析系统(或软件),对网站访问...
  • [深度学习]-Early stopping的作用代码

    万次阅读 2019-05-14 10:23:45
    1. Early stopping是...Callbacks中一些设置好的接口,可以直接使用,如’acc’,’val_acc’,’loss’和’val_loss’等等。 2. Early stopping的作用? 当我们训练深度学习神经网络的时候通常希望能获得最好的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,577,361
精华内容 630,944
关键字:

代码有什么直接作用