이번에는 call in javascript에 대한 자세한 설명을 가져오는데요, call in javascript 사용 시 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.
먼저 함수 자체에 다음과 같은 속성이 있다는 점을 이해해야 합니다.
길이: 형식 매개변수 수
이름: 함수 이름; 클래스, 프로토타입에 정의된 메소드 그들은 모두 이 클래스의 현재 인스턴스의 공개 메소드입니다.
proto: 함수를 일반 객체로 취급하고 Function 클래스의 프로토타입을 가리킵니다.
함수는 가장 복잡하고 중요한 지식입니다. 전체 JavaScript에는 여러 역할이 있습니다:
function Fn() { var num = 500; this.x = 100; } Fn.prototype.getX = function () { console.log(this.x); } Fn.aaa = 1000;var f = new Fn; f.num // undefinedf.aaa // undefined12345678910111213 var res = Fn(); // res是undefined Fn中的this是windowRole 1: 일반 함수. Fn의 경우 실행되면 개인 범위가 형성되고 형식적인 매개변수가 할당됩니다. 메모리가 소멸된 후 사전 파싱, 코드 실행 및 실행 완료가 수행됩니다. 역할 2: 클래스는 자체 인스턴스를 가지며, f는 Fn이 클래스로 생성한 인스턴스이며 속성도 있습니다. 자체 프로토타입인 프로토타입이라고 하며 해당 인스턴스는 자체 프로토타입을 가리킬 수 있습니다.
역할 3: 일반 객체, Fn은 var obj = {}의 obj와 동일하며 일반 객체입니다(모든 함수는 함수) 객체로서 자체적인 개인 속성을 가질 수도 있고 proto를 통해 전달될 수도 있습니다. Function.prototype 함수의 세 가지 역할을 찾으세요. 대부분의 학생들은 역할 1과 역할 2에 대해 의심하지 않을 것입니다. , 그러나 역할 3에 대해 약간의 의구심을 가질 수 있으므로 이해하기 위해 그림을 그립니다. 일반 객체로서의 기능.png
심층 호출
var ary = [12, 23, 34]; ary.slice();위 두 가지의 실행 프로세스 간단한 코드 라인은 다음과 같습니다. ary 이 인스턴스는 프로토타입 체인의 검색 메커니즘을 통해 Array.prototype에서 슬라이스 메소드를 찾고, 발견된 슬라이스 메소드가 실행되도록 하며, 슬라이스 메소드 실행 중에 ary 배열이 차단됩니다.
var obj = {name:’iceman’}; function fn() { console.log(this); console.log(this.name); } fn(); // this –> window // obj.fn(); // Uncaught TypeError: obj.fn is not a function fn.call(obj);호출 메서드의 역할: 먼저 호출 메서드를 찾고 마지막으로 개체의 프로토타입에서 호출 메서드를 찾습니다. 프로토타입 체인을 통해 함수를 만든 다음 호출 메서드를 실행하도록 하고, 호출 메서드를 실행할 때 fn 메서드에서 이를 첫 번째 매개변수 값인 obj로 변경하고 마지막으로 fn 함수를 실행합니다.
function sum(){ console.log(this); }function fn(){ console.log(this); }var obj = {name:'iceman'};Function.prototype.myCall = function (context) { // myCall方法中的this就是当前我要操作和改变其this关键字的那个函数名 // 1、让fn中的this关键字变为context的值->obj // 让this这个函数中的"this关键字"变为context // eval(this.toString().replace("this","obj")); // 2、让fn方法在执行 // this();};1234567891011121314151617fn.myCall(obj);//원본 this myCall 메소드에서 fn
sum.myCall(obj);//myCall 메소드의 원래 this는 sum
fn.myCall(obj); 코드 행이 실행되면 이에 대한 검색 규칙에 따라 다음이 있습니다. myCall 메소드 앞에 "."가 붙은 다음 myCall이 fn입니다. myCall 메서드를 실행하려면 첫 번째 단계에서 메서드 본문의 this가 들어오는 개체로 대체되고 원본 this가 실행됩니다. 참고: 원본 this가 실행됩니다. 학습) 이 기사에서는 fn이 실행됩니다.
function fn1() { console.log(1); }function fn2() { console.log(2); }123456출력 1
fn1.call(fn2); // 1먼저, fn1은 프로토타입 체인 검색 메커니즘을 통해 Function.prototype에서 호출 방법을 찾고 호출 방법을 실행하게 합니다. 이때 호출 방법에 있는 것은 다음과 같습니다. fn1이 작동됩니다. 호출 메서드 코드를 실행하는 동안 먼저 fn1의 "this 키워드"를 fn2로 변경한 다음 fn1 메서드를 실행하도록 합니다.
Output 2
fn1.call.call(fn2); // 2먼저 fn1은 프로토타입 체인을 통해 Function.prototype에 대한 호출 메서드를 찾은 다음 호출 메서드가 프로토타입을 통해 Function 프로토타입에 대한 호출을 찾도록 합니다(call의 값 자체도 함수이기 때문에 Function.prototype). ), 호출이 두 번째로 발견되면 메서드가 실행되도록 합니다. 먼저 이 메서드에서 이를 fn2로 변경한 다음 fn1.call을 실행합니다.
Function.prototype.call = function (context) { // 改变fn中的this关键字 // eval(....); // 让fn方法执行 this(); // 此时的this就是fn1};1234567위의 코드를 다른 형식으로 작성:
Function.prototype.call = test1;function test1 (context) { // 改变fn中的this关键字 // eval(....); // 让fn方法执行 this(); // 此时的this就是fn1};12345678우리는 이 두 가지 형식의 작성이 동일한 효과를 갖는다는 것을 알고 있습니다. 그런 다음 이때 fn1.call.call(fn2)을 test1.call(fn2)로 작성할 수 있으며 호출에서 이는 test1입니다.
Function.prototype.call = function (context) { // 改变fn中的this关键字 // eval(....); // 让fn方法执行 this(); // 此时的this就是test1};1234567참고: 현재 호출에서 이는 test1입니다. 그런 다음 호출에서 이것을 fn2로 바꾸면 test1 메서드는 다음과 같습니다.
Function.prototype.call = function (context) { // 省略其他代码 fn2(); };12345
所以最后是fn2执行,所以最后输出2。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 자바스크립트 호출에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
