闭包

独自闯荡上海,面试总结2

大兔子大兔子 提交于 2019-11-29 17:06:12
我们接着昨天说,昨天大概说了一些数据类型和原型链以及继承的东西,今天继续说下面的东西。 7.作用域和闭包 说到js面试,三座大山肯定是一个面试官都会问到,三座大山指的是原型和原型链·作用域闭包·异步,这三个我们先说一下第二个----------作用域闭包 相关题目: 说一下变量提升的理解? 说明this的几个使用场景? 10个<a>点击弹出对应序号? 如何理解作用域? 实际开发中闭包的作用? 首先第一个,考察的是你对代码执行上下文的理解,执行上下文比如下面代码: console.log(a); var a=100; 上面代码第一行打印出来肯定是undifind,因为变量执行顺序没有在调用时候定义。在看下面代码: fn("zhangsan"); function fn(name){ age=20; console.log(name,age); var age; } 上面代码执行时候输出的是什么?答案是:zhangsan,20; 为什么上面执行顺序不行,而第二个就可以,答案很简单,就是浏览器在读代码的时候会对函数声明和变量定义读取时候不一样,我具体也说不清,大家可以上网查一下,有花说不出哎,口才不好。。。。。。 变量提升理解就是变量定义和函数声明(注意函数声明和函数表达式不一样) this的相关问题 this用到的场景分为四种: 第一种:作为构造函数执行,代码如下: function

js闭包

风格不统一 提交于 2019-11-29 17:05:49
function foo() { var a = 2; function bar() { console.log( a ); } return bar; } var baz = foo(); baz(); // 2 —— 朋友, 这就是闭包的效果。 函数bar()的词法作用域能够访问foo()的内部作用域,然后我们将bar()函数本身当做一个值类型进行传递, 在这个例子中,我们将bar所引用的函数对象本身当做返回值. 在foo()执行完成之后,其返回值(),也就是内部的bar()函数,复制给变量baz并调用baz(),世纪上只是通过不同的标识符引用调用了内部的函数bar(). bar() 显然可以被正常执行.但是在这个例子中,它在自己定义的词法作用域之外的地方执行. 在foo()执行完之后,通常会期待foo()的整个内部作用域被销毁,因为我们知道引擎,有垃圾回收器来释放不再使用的内存空间. 由于看上去foo()的内容不会再被使用,所以很自然地会考虑对齐进行垃圾回收. 而闭包的神奇之处真在于此,他们阻止这件事情的发生.事实上内部作用域毅然存在,因此没有被回收,谁在使用这个内部作用域,原来是bar()本身. bar()涵盖foo()内部作用域的闭包,使得该作用域能够一直存活,以供bar()之后任何时间进行引用 bar() 毅然会该作用域引用,这个引用就叫做闭包

前端面试送命题(一)-JS三座大山

耗尽温柔 提交于 2019-11-29 17:03:14
前言 本篇文章比较适合3年以上的前端工作者, JS三座大山 分别指: 原型与原型链,作用域及闭包,异步和单线程 。 原型与原型链 说到原型,就不得不提一下 构造函数 ,首先我们看下面一个简单的例子: function Dog(name,age){ this .name = name; this .age = age; } let dog1 = new Dog("哈士奇",3 ); let dog2 = new Dog("泰迪",2); 首先创造空的对象,再让 this 指向这个对象,通过this.name进行赋值,最终返回 this ,这其实也是new 一个对象的过程。 其实: let obj = {} 是 let obj = new Object()的语法糖; let arr = [] 是 let arr = new Array()的语法糖; function Dog(){...} 是 let Dog = new Fucntion()的语法糖。 那什么是原型那? 在js中,所有对象都是Object的实例,并继承Object.prototype的属性和方法,但是有一些是隐性的。 我们来看一下原型的规则: 1. 所有的引用类型(包括数组,对象,函数)都具有对象特性;可自由扩展属性。 var obj = {}; obj.attribute = "三座大山" ; var arr = []

js三座大山

梦想的初衷 提交于 2019-11-29 17:02:42
#1、原型与原型链, #2、作用域及闭包, #3、异步和单线程, 原型与原型链 说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子: function Dog(name,age){ this.name = name; this.age = age; } let dog1 = new Dog("哈士奇",3); let dog2 = new Dog("泰迪",2); 首先创造空的对象,再让 this 指向这个对象,通过 this.name 进行赋值,最终返回 this, 这其实也是 new 一个对象的过程。 其实: let obj = {} 是 let obj = new Object() 的语法糖; let arr = [] 是 let arr = new Array() 的语法糖; function Dog(){…} 是 let Dog = new Fucntion() 的语法糖。 那什么是原型那? 在 js 中,所有对象都是 Object 的实例,并继承 Object.prototype 的属性和方法,但是有一些是隐性的。 我们来看一下原型的规则: 所有的引用类型(包括数组,对象,函数)都具有对象特性;可自由扩展属性。 ***/ var obj = {}; obj.attribute = “三座大山”; var arr = []; arr.attribute =

JS三座大山

余生颓废 提交于 2019-11-29 17:02:22
前言 本篇文章比较适合3年以上的前端工作者,JS三座大山分别指:原型与原型链,作用域及闭包,异步和单线程。 原型与原型链 说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子: function Dog(name,age){ this.name = name; this.age = age; } let dog1 = new Dog("哈士奇",3); let dog2 = new Dog("泰迪",2); 首先创造空的对象,再让this指向这个对象,通过this.name进行赋值,最终返回this,这其实也是new 一个对象的过程。 其实: let obj = {} 是 let obj = new Object()的语法糖; let arr = [] 是 let arr = new Array()的语法糖; function Dog(){...} 是 let Dog = new Fucntion()的语法糖。 那什么是原型那? 在js中,所有对象都是Object的实例,并继承Object.prototype的属性和方法,但是有一些是隐性的。 我们来看一下原型的规则: 1. 所有的引用类型(包括数组,对象,函数)都具有对象特性;可自由扩展属性。 var obj = {}; obj.attribute = "三座大山"; var arr = []; arr

三,5分钟快速了解JS中的【闭包 / 作用域】相关知识;

旧时模样 提交于 2019-11-29 17:01:58
闭包 / 作用域前端面试高频出现,极为重要!!! 很久没更新博客,因为最近事情实在太多,周末都抽不出空来,今天晚上把剪头发的时间抽出来写下这篇博客…QAQ… 废话不多说直接开写。 JS三座大山之一的【闭包/作用域】个人认为是最难理解的的JS基础问题了,基础不扎实的话很容易搞混淆。 老规矩,不要问什么是闭包,先看完文章;说到闭包就不得不说作用域,执行上下文; 回忆一下js相关基础知识,众所周知js中的变量(ES5)是没有块级作用域的,再ES6中let和const新增了块级作用域; var a = 1; function test(){ var a = 2; console.log(a)} // 2 console.log(a) // 1 咱们定义一个全局变量a 然后再到test()里面定义一个局部变量a,这时候局部变量的优先级会高于全局变量,但是 局部变量的声明并不会覆盖全局变量 只会优先使用。 再说到一个有趣的问题, 变量提升 及 执行上下文 ,看代码: 1 console.log(a) // undefined 2 var a = 100; 3 func('abc') // abc 4 function func(val){ console.log(val) } 我们打印一下a再给a赋值,发现变量a是undefiend?但是执行函数func的时候竟然成功了?这是为什么?

三座大山之闭包

可紊 提交于 2019-11-29 17:01:23
大年初四先给大家拜年啦,新年快乐,没有bug。其实我也不知道写点啥,我麻麻看我在家摊着好几天了,给我chou ma一顿。。。 下面就来说说javascript的三座大山之一,闭包吧。常常有人说js的三座大山是 闭包和作用域,原型或是原型链 ,异步和单线程。 先来说闭包: closure 闭包, 其中一个作用就是能让外部访问到函数内部的 变量,实际上就是函数里面再写函数,并返回这个函数, 另一个就是这些变量的值始终保持在内存中。 举一个简单的例子如下,首先定义一个函数,函数里面返回的是一个函数,后面加上括号是为了调用这个函数,最后在 全局上调用outter函数,alert出999。否则蒂尼的局部变量n是不会在外被访问的。 function outter(){ var n=999; return function inner(){ alert(n); }() } outter() 下面的例子是为了他的第二个特点写的: function foo(){ var a=10; return function(){ a*=2; return a; } } var f=foo(); 1.console.log(f()); 2.console.log(f()); 3.console.log(foo()()); 首先是定义了一个函数,函数中返回了另外一个函数,其主要的功能就是翻倍。 在全局环境下

python - - 函数

若如初见. 提交于 2019-11-29 16:52:00
python -- -- 函数 普通函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。 规则: 以 def 关键词开头,后接函数标识符名称和圆括号 ()。 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。(参数可以没有) 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数名所有都小写 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 注意:若定义的函数名在程序前面定义的函数名相同则将程序前面的函数名覆盖 定义方式: def 函数名(参数列表):   函数体 函数调用 你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。 参数传递 注意:类型属于对象,变量是没有类型的 a=[1,2,3] a="Runoob" 解析: [1,2,3] 是 List 类型,“Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。 固定参数 形参 定义函数时,括号里的参数,没有具体值 补充: 形参可以有默认值,调用时,该参数可以不赋值,如果赋值就会覆盖掉默认值

python---函数

℡╲_俬逩灬. 提交于 2019-11-29 16:15:36
python函数篇 普通函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。 规则: 以 def 关键词开头,后接函数标识符名称和圆括号 ()。 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。(参数可以没有) 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数名所有都小写 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 注意:若定义的函数名在程序前面定义的函数名相同则将程序前面的函数名覆盖 定义方式: def 函数名(参数列表): 函数体 函数调用 你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。 参数传递 注意:类型属于对象,变量是没有类型的 a=[1,2,3] a="Runoob" 解析: [1,2,3] 是 List 类型,“Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。 固定参数 形参 定义函数时,括号里的参数,没有具体值 补充: 形参可以有默认值,调用时,该参数可以不赋值,如果赋值就会覆盖掉默认值 如果形参有默认值

groovy与Gradle3.0

泪湿孤枕 提交于 2019-11-29 13:55:45
Gradle3.0编程与自动化构建 gradle是一款最新的,功能强大的构建工具,它使用程序代替传统的XML配置,构建项目更加灵活。gradle有丰富的第三方插件。 Gradle相关介绍及开发环境搭建 gradle相关概念介绍 领域特定语言DSL介绍 全称domain specific language:它分三类,包含建模语言,sql,html,groovy等 外部DSL 内部DSL 语言工作台 优点 1、提高开发效率,通过DSL来抽象构建模型,抽取公共的代码,减少重复的劳动; 2、和领域专家沟通,领域专家可以通过DSL来构建系统的功能; 3、执行环境的改变,可以弥补宿主语言的局限性。 DSL语言与系统编程语言相辅相成,核心思想是求专不求全,解决特定问题 groovy详解和初探 介绍 groovy是一种基于JVM的敏捷开发语言 结合了Python、Ruby和Smalltalk的许多强大特性 groovy可以与Java完美结合,而且可以使用java所有的库 特性 语法上支持动态类型,闭包等新一代语言特性 无缝集成所有已经存在的java类库 即支持面向对象编程也支持面向过程编程 groovy优势 一种更加敏捷的编程语言 入门非常的容易,但是功能非常的强大 既可以作为编程语言也可以作为脚本语言 有java基础很容易上手groovy 各系统平台下gradle开发环境搭建及工程创建 mac