JS4

详解clientWidth,scrollWidth,offsetWidth,innerWidth的区别

1.innerWidth

对于IE9+、Chrome、Firefox、Opera 以及 Safari:

window.innerHeight=浏览器窗口的内部高度

window.innerWidth=浏览器窗口的内部宽度

1.clientWidth

一、对于 Internet Explorer 8、7、6、5:

document.documentElement.clientHeight表示HTML文档所在窗口的当前高度

document.documentElement.clientWidth表示HTML文档所在窗口的当前宽度

在不同浏览器都实用的 JavaScript 方案:

var w=document.documentElement.clientWidth||document.body.clientWidth;

var h=document.documentElement.clientHeight||document.body.clientHeight;

clientWidth也可以用来获取元素的宽高,不包含元素的border.

clientWidth=元素的width+padding

3.scrollWidth

scrollHeight和scrollWidth,获取网页内容和宽度.

一、针对IE、Opera:(针对整个网页来说)

scrollHeight是网页内容的实际高度,可以小于clientHeight.

二、针对NS、FF:(针对整个网页来说)

scrollHeight也是网页内容的实际高度,但是最小值是clientHeight.

也就是说就算网页内容比浏览器窗口小,但是返回值还是cliengHeight.

浏览器兼容:

var w=document.documentElement.scrollWidth

|| document.body.scrollWidth;

var h=document.documentElement.scrollHeight

|| document.body.scrollHeight;

scrollHeight和scrollWidth还可以获取Dom元素中内容实际占用的高度和宽度.

scrollWidth=元素的width+padding

4.网页尺寸offsetHeight

offsetHeight和offsetWidth,获取网页内容高度和宽度(包括滚动条等边线,会随窗口的显示大小改变)。

offsetHeight=clientHeight+滚动条+边框.(整个网页来说)

浏览器兼容性

var w= document.documentElement.offsetWidth

|| document.body.offsetWidth;

var h= document.documentElement.offsetHeight

offset用来获取DOM元素中内容高度和宽度时包括元素的border.

offsetWidth=元素的width+padding+border

6.23

回调函数

(作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数)

如果一个函数A 作为另一个B的参数那么函数A就被称为回调函数。

解构赋值

ES6新增加的赋值方法,一般分为对象解构和数组结构两种方式。

通过解构赋值可以将属性/值从对象/数组中取出,赋值给其他变量。

作用

交换变量的值

从函数返回多个值

函数参数的定义

提取JSON的值

函数参数的默认值

遍历Map结构

输入模块的指定方法

数组按照顺序解构赋值

// 变量先声明后赋值时的结构

  var a, b, rest;

  [a, b] = [10, 20]; // a 10; b 20


  // 变量声明并赋值时的结构

  var [a, b] = [10, 20, 30, 40, 50]; // a 10; b 20


  // 默认值

  var [a = 12,b] = [,3]; // a 12; b 3


  // 将剩余数组赋值给一个变量

  var [a, b, ...rest] = [10, 20, 30, 40, 50]; // a 10; b 20; rest [30, 40, 50]

  // 注意:如果剩余元素右侧有逗号,会抛出 SyntaxError,因为剩余元素必须是数组的最后一个元素。

  var[a,...b,]=[12,23,34,45];

  // Uncaught SyntaxError: Rest element must be last element


  // 忽略某些返回值

  var[a,,b]=[12,23,34,45]; // a 12;b 34

对象按照属性解构赋值

// 变量先声明后赋值时的结构

var a, b, rest;

({a, b} = {a:10, b: 20}); // a 10; b 20


/** 备注:赋值语句周围的圆括号 ( ... ) 在使用对象字面量无声明解构赋值时是必须的。

      {a, b} = {a: 1, b: 2} 不是有效的独立语法,因为左边的 {a, b} 被认为是一个块而不是对象字面量。

      然而,({a, b} = {a: 1, b: 2}) 是有效的,正如 var {a, b} = {a: 1, b: 2}

      你的 ( ... ) 表达式之前需要有一个分号,否则它可能会被当成上一行中的函数执行。

*/


// 变量声明并赋值时的结构

var {a, b} = {a:10, b: 20}; // a 10; b 20


// 给新的变量名赋值

var {a:q, b} = {a:10, b: 20}; // q 10; b 20; a is not defined


// 默认值

var {a = 12, b} = {a:undefined, b: 20}; // a 12; b 3


// 将剩余数组赋值给一个变量

var {a = 10, b, ...rest} = {a:undefined, b: 20, c: 30, d: 40}; // a 10; b 20; rest {c: 30, d: 40}

// 注意:如果剩余元素右侧有逗号,会抛出 SyntaxError,因为剩余元素必须是数组的最后一个元素。

var{a = 10, b, ...rest,} = {a:undefined, b: 20, c: 30, d: 40};

// Uncaught SyntaxError: Rest element must be last element


// 对象属性计算名和解构

let key = "z";

let { [key]: foo } = { z: "bar" }; // foo 'bar';z is not defined


// 解构对象时会查找原型链(如果属性不在对象自身,将从原型链中查找)

字符串结构

// 当作数组结构

var [q,w] = '12'; // q 1; w 2


// 当作对象结构

var { length}= '12';// length 2

ES6闭包

简单来说:一个作用域可以访问另外一个函数内部的局部变量。闭包指有权访问另一个函数作用域中的变量的函数 简单理解:一个作用域可以访问另外一个函数内部的局部变量

function fn(){

        let num = 10

        function fun(){

            console.log(num)

        }

        fun()

    }

    fn() //10

闭包的主要作用:延伸了变量的作用范围。

// fn 外面的作用域可以访问fn 内部的局部变量

    function fn(){

        let num = 10

        // 方法一: 先定义再返回函数

        function fun(){

            console.log(num)

        }

        return fun //返回 fun函数

    }

    let f = fn()

    f() //10

闭包就是函数内部的子函数—— 等于没说

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。——靠谱

闭包就是能够读取其他函数内部变量的函数,在本质上是函数内部和函数外部链接的桥梁——靠谱

函数和对其周围状态(词法环境)的引用捆绑在一起构成闭包(closure)——很靠谱

JS 执行栈

当 js 执行全局代码的时候,会编译全局代码并创建全局上下文,全局执行上下文是只有一个的。

当执行函数的时候,会编译函数中的代码,然后创建函数上下文,函数执行完成之后,上下文就会被销毁。

执行 eval 函数的时候,eval会被编译,并创建 eval 上下文。

一.什么是执行栈?

在JavaScript当中函数一旦过多,就有多个函数执行上下文,每次调用函数创建一个新的执行上下文,那如何管理创建的那么多执行上下文呢?

JavaScript 引擎创建了执行上下文栈来管理执行上下文。可以把执行上下文栈认为是一个存储函数调用的栈结构,遵循先进后出的原则。

执行栈: call stack 一种结构,放的是函数的执行环境,每一次函数执行之前,他的所有内容全部会放到执行栈中,函数调用之前,会创建执行环境,放到执行栈当中,函数调用完成,销毁执行环境。

如上图所述:在执行栈中必须遵守先进后出,后进先出,自上而下的顺序。

JavaScript 执行在单线程上,所有的代码都是排队执行。

一开始浏览器执行全局的代码时,首先创建全局的执行上下文,压入执行栈的顶部。

每当进入一个函数的执行就会创建函数的执行上下文,并且把它压入执行栈的顶部。当前函数执行完成后,当前函数的执行上下文出栈,并等待垃圾回收。

浏览器的 JS 执行引擎总是访问栈顶的执行上下文。

执行机制 

单线程

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是因为 Javascript 这门脚本语言诞生的使命所致——JavaScript 是为处理以及操作 DOM 而诞生的。比如我们对某个 DOM 元素进行添加和删除操作,不能同时进行。 应该先进行添加,之后再删除。

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

同步和异步

为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程

于是,JS 中出现了同步和异步。

同步:

前一个任务结束后再执行后一个任务

异步:

在做这件事的同时,你还可以去处理其他事情

同步任务

同步任务都在主线程上执行,形成一个 执行栈

异步任务

JS中的异步是通过回调函数实现的

异步任务有以下三种类型

普通事件,如click,resize等

资源加载,如load,error等

定时器,包括setInterval,setTimeout等

异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)

块级作用域和局部作用域的区别

1.在块级作用域中,通过var定义的变量是全局变量;

2.在局部作用域中,通过var定义的变量是局部变量;

3.无论是在块级作用域还是局部作用域,只要省略了变量前面的let或者var,变量就会变成全局作用域里面的变量。

JS中三种创建对象的方式

利用字面量创建对象

利用new Object创建对象

利用构造函数创建对象

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1. 闭包 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在函数内创建函数,通过函数访问...
    Marvel_Dreamer阅读 3,494评论 0 21
  • 1. 闭包 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在函数内创建函数,通过函数访问...
    抽疯的稻草绳阅读 1,312评论 0 26
  • JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaSc...
    糖醋里脊120625阅读 254评论 0 0
  • JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaSc...
    XenoBladeII阅读 160评论 0 0
  • title: JavaScript问题 JavaScript 的组成 JavaScript 由以下三部分组成: E...
    _往后_阅读 251评论 0 1