首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Promise进阶——如何实现一个Promise库

通过JavaScript的执行原理我们可以知道,如果要实现异步执行相关函数的话,我们可以选择使用宏任务和微任务,这一点在Promise/A+的规范中也有提及。...我们在这里需要特别说明下的是,有些人会认为我们在调用then函数传入的两个回调函数fn和er,当前Promise就结束了,其实并不是这样,我们是得到了fn或者er两个函数的返回值,再将值传递给下一个Promise..._finishThisTypeScriptPromise(); } } } getThis 在Promise/A+规范中规定:我们在调用fn和er两个回调函数,this的指向有限制...首先我们需要先创建一个新的Promise用于返回,保证后面用户调用then函数进行后续逻辑处理可以设置新Promise的fn和er这两个回调函数。...当然,大家如果想使用我的现成代码,也欢迎大家使用我的代码Github/typescript-proimse。

1.4K20

腾讯前端一面常考面试题_2023-03-13

,而不是样式。...对于已经柯里化后的函数来说,当接收的参数数量与原函数的形参数量相同时,执行原函数; 当接收的参数数量小于原函数的形参数量,返回一个函数用于接收剩余的参数,直至接收的参数数量与形参数量一致,执行原函数。...fn(...data); } } }}如何解决跨越问题(1)CORS下面是MDN对于CORS的定义:跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP...需要注意的是,立即resolve()的 Promise 对象,是在本轮“事件循环”(event loop)的结束执行,而不是在下一轮“事件循环”的开始。...实现节流函数和防抖函数函数防抖的实现:function debounce(fn, wait) { var timer = null; return function() { var context

1K40
您找到你想要的搜索结果了吗?
是的
没有找到

Python函数

...: In [2]: add(3, 5) # 函数使用函数名来调用,函数名后紧跟一对小括号,小括号里传入函数定义的参数 8 Out[2]: 8 In [3]: add(3, 4, 5...) # 传入参数必须和函数定义的参数相匹配,如果不匹配,会抛出TypeError -----------------------------------------------------------...参数可变使用可变类型作为默认值参数默认值,需要特别注意,会改变函数的__default__属性 In [1]: def fn(xxyy=[]): ...: xxyy.append(...__defaults__ # 所有的函数参数封装成一个元组,第一个函数参数列表在动态变化 Out[6]: ([1, 1, 1],) 参数不可变 使用不可变类型作为默认值,函数体内不改变默认值 In...__defaults__ Out[11]: (0, 0) 可变参数None的使用 通常如果使用一个可变类型作为默认参数, 会使用None来代替 In [1]: def fn(lst=None): #

2.5K20

week04_python函数、参数及参数

, 而是keyword-only参数 def fn(*args, x):     print(x)     print(args) fn(3, 5) #TypeErrorfn() missing ...1 required keyword-only argument: 'x' fn(3, 5, 7) #TypeErrorfn() missing 1 required keyword-only argument...{}, y = {}".format(x, y))     print(args) fn() #TypeErrorfn() missing 1 required positional argument...: 'y' fn(5) fn(x= 6) #TypeErrorfn() missing 1 required positional argument: 'y' fn(1, 2, 3, x=10) fn...5, t=100) 注意:     代码应该易读易懂,而不是为难别人;请按照书写习惯定义函数参数; 参数解构:   给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开, 提取出所有元素作为函数的实参

52220

【原译】javascript中的错误处理

fn(); } catch (e) { } return null; } 这个处理函数接收一个 fn 回调函数作为输入,这个函数然后在处理器函数里面被调用,单元测试如下: it('returns...尤其是在对待像JavaScript这类事件驱动机制的语言,onerror的优势就更大了 ??现在我们可以使用全局处理函数来离开栈了,我们可以用来干什么呢。毕竟,调用栈还是存在的。...捕获栈信息 调用栈在定位问题超级有用。好消息是,浏览器提供了这个信息。理所当然,查看错误异常中的栈属性不是标准的一部分,但是只在新的浏览器中可以使用。所以,你就可以这样来把错误日志发送给服务器了。...注意的是,一个未被处理的异常发生,尽管我将代码使用 try-catch 包含起来了,是的, try-catch 只能在单一的作用域内有效。...我说过全局异常处理可以在任何执行上下文中执行,如果给window对象增加一个错误处理函数,就OK了。这样是不是既能处理捕获处理错误又能保持代码的优雅呢。全局的错误处理能让你的代码干净整洁。

2K90

【原译】javascript中的错误处理

fn(); } catch (e) { } return null; }   这个处理函数接收一个 fn 回调函数作为输入,这个函数然后在处理器函数里面被调用,单元测试如下: it('...尤其是在对待像JavaScript这类事件驱动机制的语言,onerror的优势就更大了   现在我们可以使用全局处理函数来离开栈了,我们可以用来干什么呢。毕竟,调用栈还是存在的。...捕获栈信息   调用栈在定位问题超级有用。好消息是,浏览器提供了这个信息。理所当然,查看错误异常中的栈属性不是标准的一部分,但是只在新的浏览器中可以使用。...注意的是,一个未被处理的异常发生,尽管我将代码使用 try-catch 包含起来了,是的, try-catch 只能在单一的作用域内有效。...我说过全局异常处理可以在任何执行上下文中执行,如果给window对象增加一个错误处理函数,就OK了。这样是不是既能处理捕获处理错误又能保持代码的优雅呢。全局的错误处理能让你的代码干净整洁。

1.5K20

2022我的前端面试总结

this指向的是全局作用域,所以会打印出window;obj.say(),谁调用say,say 的this就指向谁,所以此时this指向的是obj对象;obj.pro.getPro(),我们知道,箭头函数不绑定...(4)减少回流与重绘:操作DOM,尽量在低层级的DOM节点进行操作不要使用table布局, 一个小的改动可能会使整个table进行重新布局使用CSS的表达式不要频繁操作元素的样式,对于静态页面,可以修改类名...,而不是样式。...TypeError: fn2 is not a functionfn2这里也是在考察变量提升,关键在于第一个fn2(),这时fn2仍是一个undefined的变量,所以会报错fn2不是一个函数。...[i] = obj[i]; } return cloneObj;}深克隆:考虑基础类型引用类型RegExp、Date、函数 不是 JSON 安全的会丢失 constructor,所有的构造函数都指向

1.1K30

整理分享总结一篇call和apply的使用方法

window对象内已经出现了a属性和abc函数 那我们在定义了全局的变量a和全局的函数abc之后,为什么在使用他们没有加上window对象的前缀呢,如代码1-2 window.a; //10 window.abc...this关键字存在于函数中,表示是一个指向,或者说是一个系统"变量",值并不是固定的,但总是有迹可循。...此处执行函数fn之后,打印出fn内部的this为window对象,结合window知识点,可知此时的fn是一个全局函数,属于window对象,执行fn,相当于执行了window.fn(),fn在window...is AAA, my skills are sing B.fn("dance"); //Uncaught TypeError: B.fn is not a function; 代码3-2(构造函数创建对象写法...("sing"); //my name is AAA, my skills are sing 此处改动产生的效果为:在执行A对象的函数fn,通过call将函数fn的执行上下文(this)暂时修改为对象

40530

盘点那些 JS 手写题

== 'function') { throw new TypeError('第一个参数不是构造函数'); } // 新建一个空对象,对象的原型为构造函数的 prototype 对象...如果使用new运算符构造绑定函数,则忽略该值。当使用 bind 在 setTimeout 中创建一个函数(作为回调提供),作为 thisArg 传递的任何原始值都将转换为 object。...== 'function') { throw new TypeError('fn 不是一个函数'); } // 确定回调函数的 this 指向 let context = thisArg...== 'function') { throw new TypeError('fn 不是一个函数'); } // 确定回调函数的 this 指向 let context = thisArg...实现思路是使用递归函数,不断地去执行 setTimeout 从而达到 setInterval 的效果 function mySetInterval(fn, timeout) { const timer

1.3K30

你的手写 new 实现足够严谨吗?

这两个语句的作用难道不是一样的吗?毕竟 Fn.prototype 和 obj.__proto__ 都是指向同一个原型对象呀!...有的实现中甚至直接使用了 Object.create() 方法以快速地建立原型关系,就像这样: function myNew(Fn,...args){ if(typeof Fn !...在前面阅读规范的时候我们已经知道了,即使传给 Object.create 的参数是 null,也会将其作为创建的对象的 __proto__,所以这里如果使用了 Object.create,并且构造函数的原型...所以,如果想实现一个更加严谨的 new,那么就不应该在内部去调用 Object.create 方法,而应该选择手动创建一个对象并和构造函数建立原型关系,同时,我们还应该加入对构造函数原型的类型判断,看它到底是不是一个对象...// 检测构造函数原型是不是对象 instance.

49210
领券