精华内容
下载资源
问答
  • 执行上下文 变量提升(Hoisting)被认为是, Javascript执行上下文 (特别是创建和执行阶段)工作方式的一种认识 编译阶段,JavaScript会为上述代码创建一个执行上下文和可执行代码。 执行上下文是JavaScript...

    前言

    众所周知,JavaScript是单线程语言。所以JavaScript是按顺序执行的!

    先编译再执行

    变量提升

    请看下面的例子:

    console.log(cat)
    catName("Chloe");
    var cat = 'Chloe'
    function catName(name) {
        console.log("我的猫名叫 " + name);
    }
    

    按照得出的结论:"JavaScript是按顺序执行的"来看,步骤如下:

    • 执行第一句的时候,cat并没有定义,结果应该是抛出一个错误,然后结束执行。
    Uncaught ReferenceError: cat is not defined
    

    但实际的执行结果并不是这样:

    不仅可以执行,catName()执行结果也输出了。

    4fda87e6c5429612a1420aec5081a049.png

    这种现象就是: 变量提升

    从概念的字面意义上说,“变量提升”就是把变量和函数的声明移动到代码的最前面,变量被提升后,会给变量设置默认值--undefined。

    调整之后的执行顺序如下:

    • 首先执行var cat = undefined和function catName(){}
    • 然后执行console.log(cat) // undefined
    • 接着调用catName()
    • 最后给cat赋值cat = 'Chloe'

    移动一词容易造成误解。实际在物理层面上代码的位置并没有改变。JavaScript是解析执行的语言,在执行前会先经过编译阶段。造成这种现象的原因是:JavaScript引擎在编译阶段中将变量和函数的声明放在了内存中。

    执行上下文

    变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识

    在编译阶段,JavaScript会为上述代码创建一个执行上下文和可执行代码。

    18e3978af4d58677a7fd4ec34c7b22b5.png

    执行上下文是JavaScript执行一段代码时的运行环境,包含this、变量、对象以及函数等。

    1、在编译阶段

    • JavaScript引擎会将var变量声明和函数声明等的变量提升内容放在变量环境中。
    • 接下来JavaScript引擎会把声明以外的代码编译为字节码--可执行代码。

    2、执行阶段

    • 执行到console.log(cat)时,JavaScript引擎在变量环境中查找cat这个变量,由于变量环境存在cat变量,并且其值为undefined,所以这时候就输出undefined。
    • 当执行到catName函数时,引擎在变量环境中查找该函数,由于变量环境中存在该函数的引用,所以引擎执行该函数,并输出执行结果。
    • 执行cat赋值,引擎在变量环境查找到cat变量,并进行赋值。

    创建执行上下文的三种情况:
    1、全局执行上下文:JS引擎在编译全局代码时,创建全局执行上下文。在当前页面中,全局执行上下文仅有一个。

    2、函数执行上下文:在调用一个函数时,JS引擎会创建一个函数执行上下文。一般情况下,当函数执行完毕后就会销毁此函数执行上下文。

    3、eval函数执行上下文:执行eval函数时,也会创建一个执行上下文。

    调用栈

    JS引擎通过栈的数据结构来管理多个执行上下文。

    栈是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作

    2a2b2cf3b3bd2bf7ef29c5600dddd111.png

    在一个执行上下文创建好后,JS引擎就会它压进栈中。管理执行上下文的栈结构就称为调用栈,或者执行上下文栈。

    请看下面例子:

    function foo() {
        var a = 0
        console.log(a)
    }
    function bar() {
        var b = 1
        foo()
        console.log(b)
    }
    bar()
    

    步骤如下:

    1、创建全局执行上下文,并将其压入栈底。

    2、执行全局代码:bar()。调用bar函数时,JS引擎会编译bar函数,并为其创建一个函数执行上下文。最后将其执行上下文压入栈中,并且将变量b赋予默认值undefined。

    e8a2d8e14b633ba0d2e1f72ce9f3bfa4.png

    3、执行bar函数内部的代码。先执行b = 1的赋值操作,然后调用foo函数。JS引擎编译foo函数,并为其创建一个函数执行上下文。最后将其执行上下文压入栈中,并且将变量a赋予默认值undefined。

    c65838bea9ac7612c12710c0ff830e46.png

    4、执行foo内部的代码。执行a = 1赋值操作,然后输出a的值。foo函数执行完毕后,调用栈就将其执行上下文从栈顶弹出。接着执行bar函数。

    5、执行完bar函数后,调用栈就将其执行上下文从栈顶弹出。剩下全局执行上下文

    整个JavaScript流程执行就到此结束了。

    调用栈是JS引擎追踪函数执行的一个机制,当一次有多个函数被调用时,通过调用栈就能够追踪到哪个函数正在被执行以及各函数之间的调用关系。

    var缺陷与块级作用域

    变量提升带来的问题

    1、变量被覆盖

    var cat = "foo"
    function catName(){
      console.log(cat);
      if(false){
       var cat = "bar"
      }
      console.log(cat);
    }
    catName()
    

    调用catName时,调用栈如下图所示:

    0b916d3c0245f9e7344417b5c9f03f5f.png
    • 创建catName执行上下文时,JavaScript引擎会将var变量声明cat提升内容放在变量环境中,赋予默认值undefined。
    • 执行到catName内部的console.log(cat)时,在catName执行上下文中的变量环境找到了cat的值,输出undefined。
    • if判断为false,不执行。
    • 执行console.log(cat),参照第二步,输出undefined。

    2、变量没被销毁

    function foo () {
        for (var i=0; i<10; i++){}
        console.log(i)
    }
    foo()
    

    直观的来说,会以为for循环结束后,i会被销毁。结果并非如此,console.log(i)输出10。

    原因也是变量提升,在创建foo执行上下文时,i被提升了。所以for循环结束后,i并没有被销毁。

    块级作用域

    存储变量中的值以及对这个值进行访问或修改,是编程语言的基本功能。而 作用域 则是如何存储变量以及如何访问这些变量的规则。

    在ES6前,JavaScript只支持两种方法创建作用域:

    • 全局作用域
    • 函数作用域

    而其他编程语言则都普遍支持块级作用域。

    块级作用域 就是使用一对大括号包裹的一段代码,比如函数、判断语句、循环语句,甚至单独的一个{}都可以被看作是一个块级作用域。

    简单来讲,在块级作用域内部定义的变量在其块级作用域外部是访问不到的,并且等该内部代码执行完成之后,其定义的变量会被销毁。

    由于JavaScript不支持块级作用域,所以才会有变量提升带来的问题。

    幸好,ES6改变了现状,引入了新的let和const关键字,提供了除var以外的另一种变量声明方式。

    let和const关键字可以将变量绑定到所在的任意作用域中(通常是{}内部)。换句话说,let为其声明的变量创建了块作用域。

    块级作用域的作用,请看下面例子:

    var cat = "foo"
    function catName(){
      if(true){
       var cat = "bar"
       console.log(cat);
      }
      console.log(cat);
    }
    catName()
    

    在这段代码中,有两处声明了cat变量,一处在全局作用域,一处在catName函数作用域中的if语句里面。

    在执行if语句内部时,调用栈如下图所示:

    62b8b189b6971f7430119e8390ab01dc.png

    从图中可看出两处console.log(cat)都输出bar。

    使用let改写上面代码

    var cat = "foo"
    function catName(){
      if(true){
       let cat = "bar"
       console.log(cat);
      }
      console.log(cat);
    }
    catName()
    

    if语句执行结束后,let声明的cat变量就会被销毁,第二处的console.log(cat)就会输出foo

    44ba57e822ed2ad64ff2eb9351af4d93.png

    JavaScript内部实现块级作用域

    请看下面的例子

    function foo(){
        var a = 1
        let b = 2
        {
          let b = 3
          var c = 4
          let d = 5
          console.log(a)
          console.log(b)
        }
        console.log(b) 
        console.log(c)
        console.log(d)
    }   
    foo()
    

    步骤如下:

    1、第一步创建全局执行上下文

    2、执行foo(),创建foo函数的执行上下文

    1f37c0f114dbb7d2338ece7f5b25c016.png
    • 在函数内部使用var声明的变量都放在变量环境中,并赋予一个默认值undefined。
    • 在函数内部使用let声明的变量被放在词法环境中,没有赋予一个默认值。
    • 在函数内部中的{}内部使用let声明的变量没有放在词法环境中。

    3、执行foo函数内部的{}块,此时a和b的已经初始化了,并且进入作用域块时,作用域块中通过let声明的变量,会被存放在词法环境的一个单独的区域中,这个区域中的变量并不影响作用域块外面的变量。

    af1d3b4bbd472688792f869aecf98c32.png

    在词法环境内部维护了一个栈结构,栈底是函数最外层的变量,进入一个作用域块后,就会把该作用域块内部的变量压入栈中;当作用域执行完成之后,该作用域的let和const声明的变量就会从栈顶弹出。

    4、作用域块执行结束后,词法环境的栈结构就把其信息从栈顶弹出。

    5967f88ff3d59fe41c8665f394875d46.png

    使用let或const声明的变量,在达到声明处之前都是无法访问的,试图访问会导致一个 引用错误,即使在通常是安全的操作时(例如使用typeof运算符)也是如此。示例如 下:

    if (true) {
        console.log(typeof value); // 引用错误
        let value = 'blue'
    }
    

    因为value位于暂时性死区(temporal dead zone, TDZ)的区域内--该名称并没有在ECMAScript规范中被明确命名,但经常被用于描述let或const声明的变量为何在声明之前无法被访问。

    总结

    1、JavaScript代码是先编译再执行的。

    2、执行是按顺序一段一段执行的,一段代码是指一个执行上下文。

    3、执行上下文有三种情况:

    • 全局执行上下文
    • 函数执行上下文
    • eval执行上下文

    4、let和const支持块级作用域

    作者:zhangwinwin
    链接:JavaScript代码是怎么执行的?
    来源:github
    展开全文
  • 要先创建个wxs脚本文件里面定义函数或其它的,然后页面或组件引入这文件,就可以模板使用了。 真搞不懂为什么要绕这么一大圈,直接可以使用methods定义的方法不行吗? 恶心的一批。 // 页面代码...

    呵呵。介绍说是类似vue,用起来真累人,就想在模板中使用个函数都要查N久的文档才知道。

     

    具体要怎么操作呢?

    要先创建个wxs脚本文件,在里面定义函数或其它的,然后在页面或组件中引入这文件,就可以在模板中使用了。

    真搞不懂为什么要绕这么一大圈,直接可以使用在methods中定义的方法不行吗? 恶心的一批。

     

    // 页面代码

    <template>
        <view>
             {{xx(name)}}
        </view>
    </template>
    <script>
        import wepy from 'wepy';
        import xxdd from '../utils/xxx.wxs';
    
        export default class extends wepy.component {
            wxs = {
                xx:xxdd 
            }
        }
    </script>

     

    // xxx.wxs 文件(不支持ES6语法,对ES5的支持还得看文档)

    var print = function(value) {
        return "hello word " + value;
    }
    
    module.exports = print;

     

    注意:

    wxs是基于原生的wxs去实现的,只是通过编译把现在的语法编译为原生语法。
    wxs必须是外链文件。并且后缀为.wxs。
    wxs引入后只能在template中使用,不能在script中使用。

    文档:https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxs/07basiclibrary.html

    文档:https://tencent.github.io/wepy/document.html#/?id=wxs-weixin-script

     

    转载于:https://www.cnblogs.com/whnba/p/10920159.html

    展开全文
  • 也许有点混乱,但是 PHP 创建文件所用的函数与打开文件的相同。如果您用 fopen() 打开并不存在的文件,此函数创建文件,假定文件被打开为写入(w)或增加(a)。(推荐学习:PHP编程从入门到精通)下面的例子创建...

    PHP 创建文件 - fopen()

    dbfc69f127f1fdc45719145b2f3a9266.png

    fopen() 函数也用于创建文件。也许有点混乱,但是在 PHP 中,创建文件所用的函数与打开文件的相同。

    如果您用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)。(推荐学习:PHP编程从入门到精通)

    下面的例子创建名为 "testfile.txt" 的新文件。此文件将被创建于 PHP 代码所在的相同目录中:

    实例$myfile = fopen("testfile.txt", "w")

    PHP 文件权限

    如果您试图运行这段代码时发生错误,请检查您是否有向硬盘写入信息的 PHP 文件访问权限。

    PHP 写入文件 - fwrite()

    fwrite() 函数用于写入文件。

    fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串。

    下面的例子把姓名写入名为 "newfile.txt" 的新文件中:

    实例<?php

    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!");

    $txt = "Bill Gates\n";

    fwrite($myfile, $txt);

    $txt = "Steve Jobs\n";

    fwrite($myfile, $txt);

    fclose($myfile);

    ?>

    请注意,我们向文件 "newfile.txt" 写了两次。在每次我们向文件写入时,在我们发送的字符串 $txt 中,第一次包含 "Bill Gates",第二次包含 "Steve Jobs"。在写入完成后,我们使用 fclose() 函数来关闭文件。

    如果我们打开 "newfile.txt" 文件,它应该是这样的:Bill Gates

    Steve Jobs

    展开全文
  • PHP读写文件,可以用到一下内置函数:1.fopen(创建文件和打开文件)语法:fopen(filename,mode)filename,规定要打开的文件。mode,打开文件的模式,可能的值见下表。如果成功打开文件,fopen函...

    PHP中如何读写文件?本篇文章小编给大家分享一下PHP中读写文件代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

    在PHP中读写文件,可以用到一下内置函数:

    1.fopen(创建文件和打开文件)

    语法:

    fopen(filename,mode)

    filename,规定要打开的文件。mode,打开文件的模式,可能的值见下表。

    8f91a0e1e39d55c08a2d3d3b24d59231.png

    如果成功打开文件,fopen函数的返回值是一个文件指针,如果出错,返回 FALSE。

    示例:

    2.fclose(关闭文件)

    语法:

    fclose(filepointer)

    filepointer,要关闭的文件指针。如果成功,fclose 函数返回 TRUE,如果失败,fclose 函数返回 FALSE。

    示例:

    3.feof(检测是否已到达文件末尾)

    语法:

    feof(filepointer)

    filepointer,要检测的文件指针,该指针必须指向成功打开没有关闭的文件。如果文件指针到了文件末尾或者出错时,feof函数返回 TRUE。

    示例:

    4.fgets(从文件指针中读取一行)

    语法:

    fgets(filepointer)

    filepointer,要读取的文件指针。如果成功,从文件中读取一行并返回字符串,如果失败,返回 FALSE。

    示例:

    假设test.txt的内容为:

    hello world

    hello cnblogs

    hello heihaozi

    hello

    everyone

    页面输出的结果为:

    行1 : hello world

    行2 : hello cnblogs

    行3 : hello heihaozi

    行4 :

    hello everyone

    5.fwrite(写入文件)

    语法:

    fwrite(filepointer,string)

    filepointer,要写入的文件指针。string,要写入的字符串。如果成功,返回写入的字符数,如果失败,返回 FALSE。

    示例:

    页面输出的结果为:

    共写入100个字符

    test.txt文件会被写入:

    行1 : Hello World!

    行2 : Hello World!

    行3 : Hello World!

    行4 : Hello

    World!

    行5 : Hello World!

    注:为了简化操作,部分函数的可选参数没有列出。

    展开全文
  • Python3.2,有没有一种方法可以停止函数的其余部分的执行?基本上,我正在创建一个登录系统作为我的课程作业的一个概念,但我任何地方都找不到答案。我的代码分为两个文件,一个logger,它用一个日志文件...
  • 为了更好的组织代码,是自定义的函数可以同一个项目的多个文件中使用,通常将多个自定义的函数组织到同一个文件或多个文件中。这些收集函数定义的文件就是创建PHP函数库。如果PHP脚本中想使用这些文件中定义的...
  • linux进程通常使用fork函数创建父子进程,虽然fork函数采用的是写实拷贝技术,但是当创建的子进程并不想继续与父进程相关的操作时那些拷贝的内容就纯粹属于浪费,那么一个子进程怎样变成一个全新的进程,此时...
  • 链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。这种方法同只把函数储存已编译的OBJ文件中相比更有利于代码的重用。但随着Windows这样的多任务环境的出现...
  • 也许有点混乱,但是 PHP 创建文件所用的函数与打开文件的相同。如果您用 fopen() 打开并不存在的文件,此函数创建文件,假定文件被打开为写入(w)或增加(a)。下面的例子创建名为 "testfile.txt" 的新文件。此...
  • 一直想要怎么才能不用创建文件,才能直接执行PHP代码片段呢?终于找到了方法,现在分享出来,给有需要的人。 前提: 1. 本文只是说Windows下的情况。其他操作系统也类似,但略有不同。 2. 必需已经安装好了...
  • Windows提供的DLL文件中包含了允许基于Windows的程序Windows环境下操作的许多函数和资源。DLL多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。它们向运行于Windows操作系统下的程序提供代码、数据或...
  • Q1:怎么在html文件中调用js文件在html中调用js代码的方法主要有两种:一、将javascript直接写在html文件中,然后在html中调用js函数等;二、将js代码写一个文件中,然后在html中引用该文件,在使用js文件中定义的js...
  • 创建test-fork.c文件:#include>使用静态链接编译它:gcc -O0 -static -Wall test-fork.c -o test-fork>拆卸它:objdump -D -S test-fork>测试fork.dis>打开test-fork.dis文件并搜索fork:fork();80481f...
  • 一直想要怎么才能不用创建文件,才能直接执行PHP代码片段呢?终于找到了方法,现在分享出来,给有需要的人。前提:1. 本文只是说Windows下的情况。其他操作系统也类似,但略有不同。2. 必需已经安装好了php,并设置...
  • Rust函数的源代码位于src/lib.rs文件中。 使用将Rust函数编译到pkg目录中的WebAssembly模块中。 可选:使用node node/app.js命令Node.js中本地测试该功能。 将pkg/*.wasm文件上传到(或 ,以将其转变为Web服务。 ...
  • form中创建了个计时器timer,timer时间中调用处理方法Run(),实现定时任务,同时定时任务执行过程中会刷新状态栏数据,但是每次执行过程中form就是卡死,结果状态栏每次看到都是最后一次的刷新的情况?...
  • 1、我这段代码 可以Awake 函数中调用,目的是电脑的D盘创建文件夹名字叫做path,并创建的path这个文件夹中创建文件名字为Json.txt的文件(这是D盘中不存在这两个文件的时候才会执行) 2、通过这段代码 可以...
  • 一、什么是模块?Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。(模块能定义函数,类和变量,模块里也能包含可执行的代码...当然我们可以在代码需要的地方通过复...
  • PHP读写文件,可以用到一下内置函数:1.fopen(创建文件和打开文件)语法:代码如下:fopen(filename,mode)filename,规定要打开的文件。mode,打开文件的模式,可能的值见下表。mode 说明"r" 只读方式打开,将文件...
  • //栈空间的具体实现,下面通过动态申请空间建立数组 int stacksize;//栈的大小,当为0时,栈没有创建空间 int top;//栈顶位置,当为-1时,栈为空 }; //以下为栈的实现部分,如果用工程建立程序,可以另外...
  • 我想动态创建T类型对象, C#可以通过 class A<T> where T :new() 来限制 T类型必须要有公共无参构造函数,java里怎么做到这种限制?...我想java里也实现强制子类必须有公共无参构造函数,但不知道怎么实现。
  • Com组件开发过程中用的不多,资料也不多,故记录开发Com组件的部分问题。这一篇文章里,讲解了如何使用VS2010...主文件代码如下:#include "stdafx.h"#include "../testCom/testCom_i.h"#include "../testCom/te...
  • 下面是我的完整代码 求求哪位大佬帮我加这两个函数,课设要答辩了,来不及辽!!!! ``` #include #include #include #include using namespace std; typedef int contacttype; class contact{ ...
  • n=getTree(name) //这个程序我没有写,要完成的功能是把对应名字的dat文件中的二叉树读出来,然后n为其根节点 operateTree(); break; } } } //未完成 int main() { operate(); } 大概就是我不知道...
  • 前言 作为一名嵌入式开发工程师,C代码的模拟很重要,不能每次都在板子上面烧写...下面介绍下clion,在代码模拟过程只有一个main.c,无法**"同时共存多个main**"如果不想要重新开个工程怎么在创建第二个文件进行...
  • 4.模块定义文件中的库文件名应和工程名一致。 DllMain函数 Windows加载DLL时,需要一个入口函数,就像控制台程序需要main函数一样。有的时候,DLL并没有提供DllMain函数,应用程序也能成功引用DLL,这是因为...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 362
精华内容 144
关键字:

怎么在代码文件中创建函数