热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一些corejavascript的基础知识

一、setTimeoutsetTimtout(function(){alert(2);后弹出},0);alert(1);先弹出对于如上代码,包

一、setTimeout  

setTimtout(function(){
   alert(2);                           // 后弹出
},0);
alert(1);                              // 先弹出

  对于如上代码,包含原理如下:

  1、首先jsvm只会执行一个线程;

  2、当这个线程遇到setTimout的时候,就会讲这个function放到某个队列里面;

  3、当前这个线程空闲的时候,就会执行任务队列轮询的代码,将满足条件的函数拿出来执行。

  比较简单典型的一个应用场景就是:

$(elem).html(xxxxxx);

setTimeout(function() {

  // 内部DOM操作很复杂,此处setTimeout用于保证在内部DOM操作结束并且相关内存被释放掉后执行后续代码

}, 0);

二、eval

  js中除了全局作用域和函数作用域之外,还存在一个eval作用域。

  eval函数执行的时候,会根据当前执行上下文创建一个作用域。

  此处有如下代码:

function a() {
  var b = new SomeThing();
  return function() {
    eval(‘‘);
  };
}

  如果内部的那个匿名函数使用eval,即便eval中执行的代码没有用到b变量,b也不会被释放掉;如果没有使用eval函数,有的浏览器会释放掉b,有的会根据自身优化,选择不释放掉b。

  所以,eval通常是不应该非全局作用域下面执行的,于是jquery有了globalEval函数。

三、预编译

  先分别上如下几个片段的代码:

<html>
<head>
<script>
a();
function a(){
  alert(1);
}
script>
head>
<body>body>
html>
<html>
<head>
<script>
a();
script>

<script>
function a(){
  alert(1);
}
script>
head>
<body>body>
html>
<html>
<head>
<script>
a();
var b = function a(){
  alert(1);
}
script>
head>
<body>body>
html>

  执行结果分别是:

  第一段代码:弹出1;

  第二段代码:第一个script片段报错,a不存在;

  第三段代码:报错,a不存在;

  原因:

  第一段代码中,jsvm会预编译,构造好a函数,所以访问a函数的顺序是不重要的;

  第二段代码中,预编译是会分代码块执行的,每个script都会形成一个代码块,即便script是通过src引入js的;

  第三段代码中,a函数的定义由于放在了一个表达式当中,因此jsvm不会预编译。

  但是,此处还可以继续深入,第三段代码改成如下所示:

<html>
<head>
<script>
var b = function a(){
  alert(1);
}
a();
script>
head>
<body>body>
html>

  这段代码也同样会报错,a不存在。为什么呢?原因就是a函数放在了表达式当中,jsvm会把a函数看作一个匿名函数,因此在当前语句执行完,a就被释放掉了。

  但是,请注意,上面讨论的都是根据w3c标准得出的结果,在第三段和第四段代码中,IE 6、7、8还是会预编译的,并且不会释放掉a,因此不会报错。

四、自执行函数

  自执行函数的几种形式:  

(function() {})();
(function() {}());
!function(){}();
void function(){}();

  其中第三种写法会造成额外的运算,因为要对返回的内容做“非”操作。

五、弱式转化[TODO]

六、预编译中的变量声明

  如下代码:  

function a(x){
  return x*2;
}
var a;
alert(a);

  var a只是声明,并不会干啥,var a只会让当前作用域的alert(a)不会报a不存在的错误,a实际上是什么,需要显示赋值;如果var a之前已经存在a了,则啥也不干。

七、function传参

  如下代码:

function fn1(a, b, c){
   a = 1.2;
   b = 2.2;
   c.c = 3.2;
}

var a = 1;
var b = 2;
var c = {c:3};

fn1(a,b,c);

alert(a);
alert(b);
alert(c.c);

  原理不难理解,注意值类型和引用类型的区别。

八、作用域链

  有如下几点:

  1、作用域链是在定义的时候就确定下来了的;

  2、隐式对象模型:对于一个作用域,jsvm会创建一个隐式对象,然后在这个对象上面绑定当前作用域的各种变量。多个函数的嵌套定义也就会形成一条作用域链了。如果在某个作用域中要访问一个a变量,则会首先在当前作用域中查找是否存在a变量,如果不存在,则向上找父作用域隐式对象中是否存在a变量,依次类推,如果到了根作用域还找不到a变量的话,就会报错了。

九、类数组结构

  第一个问题,如何构造类数组结构?思路简单,不赘述。

  jquery选择器构造出来的就是一个类数组结构。

十、工厂模式

function factory() {
  return new ThisIsAClass();
}

  优点:

  1、可以防止调用者把构造函数直接当成函数调用了;

  2、省略了成片成片的new关键字,jquery就是一个正面例子。

一些core Javascript的基础知识


推荐阅读
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
author-avatar
傻傻的不敢看结5_749
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有