作为普通函数function fn1() { console.log(this); } fn1(); // window使用call、bind、apply 调用function fn1() { console.log(this); } fn1.call({ name: 'zhangsan' }); // {name: 'zhangsan'} const fn2 = fn1.bind({ name: 'lisi' }); fn2(); // {name: 'lisi'函数的bind是返回一个新的函数作为对象方法调用const fn1 = { name: 'gonwe', sayName() { console.log(this); // {name: 'gonwe'} }, wait() { setTimeout(function () { console.log(this); // window }); } }在箭头函数调用const fn2 = {
JS基础 - 作用域和闭包1.作用域作用域:一个变量的合法使用范围全局作用域直接编写在script标签之中或者是一个单独的js文件中的js代码,都是全局作用域。全局作用域在页面打开时创建,页面关闭时销毁;在全局作用域中有一个全局对象window (代表的是一个浏览器的窗口,有浏览器创建),可以直接使用。所有创建的变量都会作为window对象的属性保存。所有创建的函数都会作为window 对象的方法保存。//在任何地方都可以访问到的变量就是全局变量,对应全局作用域 console.log(this) window函数作用域 (局部作用域)在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用调用函数是创建函数作用域,函数执行完毕之后,函数作用域就销毁;每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的。块级作用域(ES6 新增)//ES6 块级作用域 if (true) { let x = 100 } console.log(x) // Uncaught ReferenceError: x is not defined //只要使用 let 或者 const
如何理解 JS 原型和原型链(隐式原型和显示原型)1.原型ES6中的 class 是一个语法糖,class实际上是一个函数。// 父类(基类) class People { constructor(name, age) { this.name = name; this.age = age; } sayName() { console.log(this.name); } } // 子类使用 extends 关键字 实现继承 class Programmer extends People { constructor(name, type) { // super() 调用父类的构造函数 super(name); this.type = type; } code() { console.log(`${this.name} is 正在写代码`); } job() { console.log(`${
1.ClassES6提供了更接近面向对象(注意:javascript本质上是基于对象的语言)语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。 基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。class Programmer { constructor(name, type) { this.name = name; this.type = type; } code() { console.log(`${this.name} is 正在写代码`); } job() { console.log(`${this.name} is ${this.type}`); } } const John = new Programmer('John', '前端工程师'); console.log(John.name); // John c
字符串拼接const a = 100 + '100'; // '100100' const b = 100 + 10; // 110 const c = true + '100'; // 'true100'只要有字符串运算就不在是加法,而是字符串拼接== 运算符100 == '100' //true 0 == '' //true 0 == false //true false == '' //true null == undefined //true== 会类型转换尽量让值去相等=== 运算符// 除了==null外,其余全部使用 === const obj = { x:100 } if (obj.a == null) { //这里相当于 obj.a === null || obj.a === undefined,简写形式 //这是jquery源码中推荐的写法 }if语句truly变量:两步非运算等于true( !!a === true )的变量falsely变量:两步非运算等于false (!!a === false) 的变量// 以下是falsely变量。除此之外都是truly变
ECMAScript发展进程中,会有很多功能的更新,比如销毁,箭头功能,模块,它们极大的改变JavaScript编写方式,可能有些人喜欢,有些人不喜欢,但像每个新功能一样,我们最终会习惯它们。新版本的ECMAScript引入了三个新的逻辑赋值运算符:空运算符,AND和OR运算符,这些运算符的出现,也是希望让我们的代码更干净简洁,下面分享几个优雅的JavaScript运算符使用技巧一、可选链接运算符【?.】可选链接运算符(Optional Chaining Operator) 处于ES2020提案的第4阶段,因此应将其添加到规范中。它改变了访问对象内部属性的方式,尤其是深层嵌套的属性。它也可以作为TypeScript 3.7+中的功能使用。相信大部分开发前端的的小伙伴们都会遇到null和未定义的属性。JS语言的动态特性使其无法不碰到它们。特别是在处理嵌套对象时,以下代码很常见:if (data && data.children && data.children[0] && data.children[0].title) { // I
答案:是指没有用任何别的框架,如jQuery等的纯JS:VanillaJs === JavaScriptVanilla JavaScript不是框架,更不是别的奇奇怪怪的东西,它就是指最朴素的原生JavaScript背景:Vanilla:意思是“香草”。这个词与冰淇淋有关,没有味道的冰淇淋就是香草味冰淇淋,把这个概念移植到JS中,这仅仅只是为了区别使用了如jQuery等框架的JS。
在chrome的收藏夹上,右键,添加网页命名为:破解鼠标限制在网址上填上这个↓javascript:(function() { function R(a){ona = "on"+a; if(window.addEventListener) window.addEventListener(a, function (e) { for(var n=e.originalTarget; n; n=n.parentNode) n[ona]=null; }, true); window[ona]=null; document[ona]=null; if(document.body) document.body[ona]=null; } R("contextmenu"); R("click"); R("mousedown"); R("mouseup"); R("selectstart");})()保存在书签栏,然后你打开你那个网站,再点击刚刚保存的书签,就可以用鼠标复制了。但是,发现
一、JavaScript中值的两种类型简单数据类型:又叫值类型,基本类型。变量中存储的是值本身。// 值类型 let a = 100; let b = a; b = 200; console.log(a) //100;常见值类型包含:String(字符串)、Number(数值)、Boolean(布尔值)、Undefined、Symbol(表示独一无二的值)。let a ; //const 定义必须有值,let不用 const b = 'string'; const c = 123; const d = true; const s = Symbol('s');//ES6 新增类型复杂数据类型:又叫引用类型。变量中存储的仅仅是地址(引用)。// 引用类型 let a = {time:100}; let b = a; b.time = 200; console.log(a) //200;其中包含:Array(数组)、Object(对象)、Null、Function(函数)。// 引用类型 const a = [1,2,3]; const b = {time:100}; // 特殊的引用类型,
Gonwe
一念智即般若生。
CC BY-SA 4.0