你不知道的javascript(上卷)----读书笔记

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>你不知道的javascript(上卷)</title>
</head><body><script type="text/javascript">/*//9、this 的全面解析this的绑定和函数声明位置没有任何关系,之取决于函数的调用方式在理解this的绑定过程之前,首先理解调用位置:调用位置就是在代码中被调用的位置(问不是声明位置,)。只有仔细分析调用位置才能回答这个问题:这个this到底引用的是什么通常来说,寻找调用位置就是寻找“函数被调用的位置”2.1、函数调用位置function baz(){console.log("baz");  bar();  //bar的调用位置}function bar(){console.log("bar");foo();//foo的调用位置}function foo(){console.log("foo");}baz();//baz的调用位置b、函数调用位置2function foo(){console.log(this.a);}var a = 2;//2foo();function foo(){"use strict";console.log(this.a);  //报错,严格模式下,this不会默认绑定给window}var a = 2;foo();function foo(){console.log(this.a);}var a = 2;(function(){"use strict";foo(); //2})();//三种情况下,只要函数执行不是执行在严格模式下,默认绑定才会绑定到全局上2.2、绑定规则2.2.1默认绑定function foo(){console.log(this.a);}var a = 2;foo();//2//非严格模式下,this默认绑定在window下function foo(){"use strict";console.log(this.a);}var a = 2;foo();// this is not defined;//严格模式下不能将全局对象默认绑定,因此this会绑定到undefined上function foo(){console.log(this.a);}var  a = 2;(function(){"use strict";foo();//2 })()//严格模式下的调用不影响默认绑定2.2.2隐式绑定function foo(){console.log(this.a);}var obj = {a : 2,foo : foo}obj.foo();//无论是直接在obj中定义还是先定义在添加为引用属性,这个函数严格来说不属于obj对象,//调用位置会使得obj上下文来引用函数,因此你可以说函数被调用时obj对象“拥有”或者“包含”函数function foo(){console.log(this.a);}var obj2 = {a : 42,foo : foo}var obj1 = {a : 2,obj2 : obj2}obj1.obj2.foo();//42//对象属性引用链中只有上一层或者说最后一层在调用位置中起作用。//隐式丢失function foo(){console.log(this.a);}var obj = {a : 2,foo : foo}var bar = obj.foo;//函数别名var a = "oops,global";bar();//"oops,global";2.2.3显示绑定function foo(){console.log(this.a);}var obj = {a : 2,}foo.call(obj);//2//通过foo.call(..),我们可以调用foo时强制把他的this绑定到obj上//硬绑定 function foo(){console.log(this.a);}var obj = {a : 2,}var bar = function(){foo.call(obj);}bar();//2setTimeout(bar,1000);//2bar.call(window);//2//硬绑定的bar不可能在修改他的this//创建函数bar(),并且在内部手动调用foo.call(obj),//因此强制把foo的this绑定到obj,无论后面我们如何调用到bar(),//他总会手动在obj上调用foo,这种绑定是一种显性绑定,因此我们称之为硬绑定//API调用的‘上下文’function foo(el){console.log(el,this.id); //1 awesome 2 awesome 3 awesome}var obj = {id : "awesome",}//调用foo()时把this绑定到objvar arr = [1,2,3].forEach(foo,obj);//console.log(arr);new 绑定使用new调用函数,会执行以下操作1、创建(或者说构造)一个全新的对象2、这个新对象会被执行[[Protoptye]]连接3、这个新的对象会绑定到函数调用的this4、如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新的对象function foo(a){this.a = a;}var bar = new foo(2);console.log(bar.a);2.3优先级默认绑定 < 隐式绑定 < 显式绑定 < new ....2.4被忽略的thisfunction foo(){console.log(this.a);}var a = 2;foo.call(null);//2//call 参数为null或者undefined的时候会默认是全局this柯里化。。。。*//*8、this词法 var foo = a =>{  console.log(a);}foo(2); //2//箭头函数,是根据为层(函数或者全局)作用域来决定thisvar foo1 = function(a){console.log(a);}foo1(2);// 两种声明是等效的var obj = {id : "awesome",cool:function coolFn(){console.log(this.id)}};var id = "not awesome";obj.cool(); //awesomesetTimeout(obj.cool,100); // not awesome // setTimeout 导致 cool()函数丢失了同this之间的绑定//解决方案var obj = {count : 0,cool: function coolFn(){var self = this;if(self.count<1){setTimeout(function timer(){self.count++;console.log("awesome");},100);}}}obj.cool(); // awesome*//*//7、动态作用域function foo(){console.log(a);}function bar(){var a = 3;foo();}var a = 2;bar();  //2  输出结果是2,词法作用域让foo()中的a通过RHS引用到了全局//作用域中的a,因此会输出2function foo(){console.log(a); //a is not defined}function bar(){var a = 3;foo();}bar();function foo(){var a  = 3;console.log(a); //引用的是局部变量a的值}var a = 1;foo();// 3*//*//5、闭包作用域function foo(){var a = 2;function bar(){console.log(a);}return bar;}var baz = foo();baz(); //2 foo() 的返回值是bar()函数,所以通过baz()可以执行这个函数function foo(){var a = 2;function baz(){console.log(a);}bar(baz);} function bar(fn){fn();  }foo();//2  foofor(var i = 0;i<=5;i++){(function(){var j = i;setTimeout(function time(){console.log(j);  // 每100毫秒输出一个数,分别输出0,1,2,3,4},j*100);})()}for(var i = 0;i<=5;i++){(function(j){setTimeout(function time(){console.log(j); // 每100毫秒输出一个数,分别输出0,1,2,3,4},j*100);})(i)}for(var i = 1;i<=5;i++){(function(){setTimeout(function time(){console.log(i); // 每100毫秒输出一个数,分别输出6,6,6,6,6},i*100);})()}*//*//4、提升 --先编译在执行a = 2;var a;console.log(a);//a  因为var声明的变量存在提升console.log(b); //undefined var声明存在提升,赋值不存在提升,所以b存在但是没赋值var b = 2;foo();  //函数竟然可以执行,说明函数声明也提升了function foo(){console.log(a); //undefined , 声明提升了,不存在赋值提升var a = 2;}foo(); //1  var foo;function foo(){console.log(1);}foo = function(){console.log(2)}//引擎编译如下function foo(){console.log(1);}foo(); //1  var foo = function(){console.log(2)}foo(); //3//var foo 尽管出现在在function之前,但是由于是重复声明,所以被忽略掉//函数声明会被提升到普通变量之前function foo(){console.log(1);}var foo = function(){console.log(2);}function foo(){console.log(3);}foo();  // foo is not a functionvar a = true;if(a){function foo(){console.log("A");}}else{function foo(){console.log("B");}}*//*//3.4.3、let和var的区别for(var i = 0;i<10;i++){}console.log(i);// 10for(let j=0;j<10;j++){}console.log(j);// j is not defined//for循环结束后i并没有被销毁,导致全局污染*//*//3.3.2、立即执行函数:抱在一对括号内var a = 2;(function foo(){var a = 3;console.log(a); //3})();console.log(a);// 2*//*//块级作用域,函数作用域//3.2、规避冲突*//*function foo(){function bar(a){i = 3;console.log(a+i);}for(var i = 0;i<10;i++){bar(i*2);}}foo();//死循环,bar中的i覆盖了for循环中的i导致死循环*//*//2.2.1、evalfunction foo(str,a){ eval(str);console.log(a,b); //4}var b = 2;var result = foo("var b = 3;",1);console.log("result:",result); //undefined???默认严格模式?//书上的结果是1,3因为eval(str)== var  b = 3; 读取的是局部变量3function foo(str){"use strict";eval(str);console.log(a);}foo("var a = 2");//a si not defined*/</script>
</body></html>

  

转载于:https://www.cnblogs.com/SunlikeLWL/p/7376458.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lightgbm 数据不平衡_不平衡数据下的机器学习(下)

本文从不平衡学习的基础概念和问题定义出发&#xff0c;介绍了几类常见的不平衡学习算法和部分研究成果。总体来说&#xff0c;不平衡学习是一个很广阔的研究领域&#xff0c;但受笔者能力和篇幅的限制&#xff0c;本文仅对其中部分内容做了简单概述&#xff0c;有兴趣深入学习…

netty实现高性能文件服务器,通用文件服务组件(Netty实现版本)

本文所述文件服务组件在笔者此前一篇文章中已有阐述(基于netty的文件上传下载组件)&#xff0c;不过本文将基于之前这个实现再次进行升级改造&#xff0c;利用基于注解的方式进行自动装配。1. 简介1.1 Netty简介Netty是一个异步事件驱动的网络应用程序框架&#xff0c;用于快速…

leetcode343. 整数拆分(动态规划)

给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 解题思路 组成整数两个数可以进一步拆分&#xff0c;所以可以运用到动态规划&#xff0c…

爱前端2018全栈大前端_启动2018年前端工具调查

爱前端2018全栈大前端by Ashley Watson-Nolan通过阿什利沃森-诺兰 启动2018年前端工具调查 (Launching the Front-End Tooling Survey 2018) The Front-End Tooling Survey is back to gather input and shed some light on the tooling habits across the web development in…

PHP 小数点保留两位【转】

最近在做统计这一块内容&#xff0c;接触关于数字的数据比较多&#xff0c; 用到了三个函数来是 数字保留小数后 N 位&#xff1b; 接下来简单的介绍一下三个函数&#xff1a; 1、number_format echo number_format("5000000")."<br>"; echo number_…

华为杯数学建模2020获奖名单_我校在2020年全国大学生数学建模竞赛中再获佳绩(内附获奖名单)...

# 近日&#xff0c;从全国大学生数学建模竞赛组委会获悉&#xff0c;我校在2020年全国大学生数学建模竞赛中获得5项国家二等奖。国家奖获奖数量在全国农林院校中并列排名第二。在黑龙江省高校中位居第三名。1你的喜悦&#xff0c;我们的欣慰# 2020年全国大学生数学建模竞赛于9月…

Python 面试总结

公司面试&#xff1a; 1&#xff0c;说说项目都用到了什么技术&#xff1f; 2&#xff0c;mysql索引的种类&#xff1f; 3&#xff0c;索引建多有什么不好&#xff1f; 4&#xff0c;mysql的引擎有什么&#xff1f; 5&#xff0c;redis是单线程还是多线程的? 6, redis的持久化…

医疗器械监管系统总结

算算时间毕业也两个多月了&#xff0c;心也慢慢塌下来了&#xff0c;少了些许的浮躁&#xff0c;增加了些许的淡定&#xff0c;同时也添加了一些不好的习气&#xff0c;“混”&#xff0c;混日子的混&#xff0c;生活慢慢的缺少了激情&#xff0c;伴随着和她渐渐的疏远。昨天听…

fn映射 mac 键盘_【新鲜评测】高颜值、低延迟、多模式跨平台办公神器-米物蓝牙键盘...

首先&#xff0c;要例行感谢糖纸众测&#xff0c;感谢麻麻酱给我这次评测机会。大家可以微信搜索【糖纸】小程序免费体验更多科技产品。小米旗下生态链公司米物最近出了一款蓝牙双模键盘&#xff0c;它作为一个85全键键盘&#xff0c;可以完成蓝牙和USB转换&#xff0c;以及PC和…

leetcode413. 等差数列划分(动态规划)

数组 A 包含 N 个数&#xff0c;且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q)&#xff0c;P 与 Q 是整数且满足 0<P<Q<N 。 如果满足以下条件&#xff0c;则称子数组(P, Q)为等差数组&#xff1a; 元素 A[P], A[p 1], …, A[Q - 1], A[Q] 是等差的。并且 …

(转发)python3用matplotlib绘图出现中文乱码的问题

from pandas import Series,DataFrame import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei] 字体的选择如下&#xff1a; 黑体 SimHei微软雅黑 Microsoft YaHei微软正黑体 Microsoft JhengHei新宋体 NSimSun新细明体 PMingLiU细明…

小程序 input 换行_小程序 input双向数据绑定

小程序 双向绑定数据&#xff08;单个&#xff09;<小程序 双向绑定数据&#xff08;多个&#xff09;<

平面设计 前端_我如何在5个月内从平面设计师过渡到前端开发人员

平面设计 前端2017 was a bumpy yet exciting year for me. I left my graphic designer job in March, and entered the maze of the coding world. Five months later, I finally got a job as a front-end developer at Tenten.co.2017年对我来说是坎a而又令人兴奋的一年。 …

logstash5.x改变

5.x版本 logstash中 elasticsearch插件的workers&#xff0c;无法配置大于1&#xff0c;会提示 This plugin uses the shared and doesnt need this option 这个的意思是进到logstash本身的配置文件pipeline.output.workers。 不要一开始就修改workers个数。这也许是一个误区。…

Suricata的初始化脚本

见官网 https://suricata.readthedocs.io/en/latest/initscripts.html

jpa在自己创建表的是字段名不一致_用 数据透视表 完成 Excel多表合并

一般情况下&#xff0c;数据透视表只能汇总一个表格中的数据。即使使用多区域汇总&#xff0c;也只能对多表的单列内容进行数据汇总&#xff0c;而多列却无法实现。前段时间也推送过Power Query的方法&#xff0c;但它有版本限制。而今天宏兴会计培训小编推送的是一个通用的多表…

python根据数据生成图像_从三个numpy数组生成图像数据

首先&#xff0c;您应该运行以下代码&#xff1a;import numpy as npX np.asarray()Y np.asarray()Z np.asarray()Xu np.unique(X)Yu np.unique(Y)然后您可以应用以下任何一种方法。值得注意的是&#xff0c;即使数据没有被分类(与目前接受的答案相反)&#xff0c;所有这些…

leetcode120. 三角形最小路径和(动态规划)

**给定一个三角形&#xff0c;找出自顶向下的最小路径和。**每一步只能移动到下一行中相邻的结点上。 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。 例如&#xff0c;给定三角形&#xff1a; [ [2], [3,4], [6,5,7], [4,1,…

Bootstrap教程:学习构建第一个Bootstrap 4网站

快速教程&#xff0c;可帮助您快速掌握最新版本的Bootstrap。 (A quick tutorial to get you up to speed with the latest version of Bootstrap.) In my opinion, the best way to learn a new technology is often to start building stuff from day one. This gives a sens…

使用栈实现队列 Implement Queue using Stacks

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of queue.pop() -- Removes the element from in front of queue.peek() -- Get the front…