深入javascript计划四:深入浅出this

深入理解函数内部原理(6)——函数的内部方法call、apply、bind call和apply这两个方法都是打破了解析器在函数调用时创建执行环境时赋值this绑定的时候的内部规则,直接通过Function内置标准类型的prototype属性中的两个方法call和apply进行明确的声明this的值。 但是这里的call是自定义的用户可以使用的可以编程的,还有任何一个函数都有内置属性[[Call]],这两者不同。后者内部原理性的调用,创建执行环境的。 具体表述下call 阅读详情

这篇我们来深入了解this,this关键字是javascript中最复杂的机制之一,它是一个很特别的关键字,被自动定义在所有函数的作用域中。

什么是this?

1.this是javascript中的关键字。它是对象自动生成的一个内部对象,只能在对象内部使用。随着函数使用场合不同,this的值会发生变化。

2.this指向什么?完全取决于什么地方以什么方式调用,而不是创建时(this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象)。

小知识:

var定义的变量是window/global对象的属性,是js语言特有的属性之一。

window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以可以使用window.xxx来访问对象。

let和const声明的变量不会添加到window对象中。

var a = "an";
console.log(window.a);// "an"

let b = "an";
console.log(window.b);// "undefined"
console.log(b); // an

const c = "an";
console.log(window.c);// "undefined"
console.log(c); // an

箭头函数与普通函数

普通函数:指向函数的调用者。有个简便的方法就是看函数前面有没有点,如果有点,那么就指向点前面的那个值。

箭头函数:指向函数所在的作用域。 注意对象的{}以及 if(){}都不构成作用域。

箭头函数与普通函数比较

箭头函数:

1.没有this,需要通过查找作用域来确定this的值。

(如果箭头函数被非箭头函数包含,this 绑定的就是最近一层非箭头函数的 this)

// let a = 1 // testObj.c() 为查询为undefined 因为let定义的变量不会添加到window
var a = 1 // testObj.c() 为查询为 1
function test() {
    let testObj = {
        a: 11,
        b: function() {
            // console.log(this) // 指向testObj
            let obj = {
                a: 10,
                b: function() {
                    console.log(this.a) // 10
                },
                c: {
                    a: 20,
                    fn: function() {
                        console.log(this.a) // 20
                    },
                },
                d: {
                    a: 30,
                    fn:() => {
                        // console.log(this) // 指向testObj
                        console.log(this.a) // 11
                    }
                }
            }
            obj.b()
            obj.c.fn()
            obj.d.fn()
        },
        c: () => {
            // console.log(this) // 指向window
            console.log(this.a) // 1
        },
        d: function() {
            console.log(this.a)  // 11
        }
    }
    testObj.b()
    testObj.c()
    testObj.d()
}
test()

主要讲解箭头函数,普通函数下面会详解

讲解:

testObj.c(),因为使用了箭头函数,所以从作用域开始查找,往上一层就是全局作用域,查询全局作用域有没有a,然后输出1,如果没有就输出undefined。

obj.d.fn(),因为使用了箭头函数,所以从作用域开始查找,往上一层就是b()发现它不是箭头函数就使用它的作用域,b()的this指向本身,然后查询b()的this有没有a这个变量,然后输出11,如果没有就输出undefined。

2.没有 arguments

let obj = {
    a: 10,
    b: () => {
        console.log(arguments)
    }
}
obj.b("a", "b") // Uncaught ReferenceError: arguments is not defined 

箭头函数没有自己的 arguments 对象,这不一定是件坏事,因为箭头函数可以访问外围函数的 arguments 对象:

function test() {
    return () => arguments[0]
}

let fn = test(1);
console.log(fn()); // 1

3.不能通过new关键词调用

JavaScript 函数有两个内部方法:[[Call]] 和 [[Construct]]。

当通过 new 调用函数时,执行 [[Construct]] 方法,创建一个实例对象,然后再执行函数体,将 this 绑定到实例上。

当直接调用的时候,执行 [[Call]] 方法,直接执行函数体。

箭头函数并没有 [[Construct]] 方法,不能被用作构造函数,如果通过 new 的方式调用,会报错。

let foo = () => {}
let fn = new foo() // TypeError: foo is not a constructor

4.没有new.target

因为不能使用 new 调用,所以也没有 new.target 值。想了解更多new.target

5.没有原型

由于不能使用 new 调用箭头函数,所以也没有构建原型的需求,于是箭头函数也不存在 prototype 这个属性。

let foo = () => {}
console.log(foo.prototype) // undefined

6.没有super

连原型都没有,自然也不能通过 super 来访问原型的属性,所以箭头函数也是没有 super 的,不过跟 this、arguments、new.target 一样,这些值由外围最近一层非箭头函数决定。

总结

MDN 的介绍:

An arrow function expression has a shorter syntax than a function expression and does not have its own this, arguments, super, or new.target. These function expressions are best suited for non-method functions, and they cannot be used as constructors.

翻译过来就是:

箭头函数表达式的语法比函数表达式更短,并且不绑定自己的this,arguments,super或 new.target。这些函数表达式最适合用于非方法函数(non-method functions),并且它们不能用作构造函数。

什么是non-method functions 呢?

A method is a function which is a property of an object.

翻译过来

对象属性中的函数就被称之为 method,那么 non-mehtod 就是指不被用作对象属性中的函数了。

可是为什么说箭头函数更适合 non-method 呢?看上面解释对比例子。

let obj = {
    i: 10,
    b: () => console.log(this.i, this),
    c: function() {
      console.log( this.i, this);
    }
}
obj.b(); // undefined {}-Window
obj.c(); // 10 { i: 10, b: [Function: b], c: [Function: c] }

 

普通函数this绑定规则

有三种绑定规则:默认绑定、隐式绑定、显示绑定

1.this默认绑定

普通函数:

window.a = 1; || var a = 1;
function foo() {
    console.log(this.a); // 1
}
foo();

这种就是默认绑定。看到 foo() 这种直接使用而不带任何修饰的函数调用 ,就默认且只能应用默认绑定。

默认绑定到window对象。

2.隐式绑定

普通函数:

window.a = 1; || var a = 1;
function foo(){
    // console.log(this);
    console.log(this.a);
}
var obj = {
    a : 10,
    foo : foo
}
foo(); // 1
obj.foo(); // 10

讲解:foo()直接调用就是我们上面所说的 默认绑定,this绑定到window上。

讲解:这里的this指向的是对象obj,因为你调用这个foo是通过obj.foo()执行的,那自然指向就是对象obj,这里再次强调一点,this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁。

问题来了,看例子:

window.a = 1; || var a = 1;
function foo(){
    // console.log(this);
    console.log(this.a);
}
var obj = {
    a : 10,
    foo : foo
}
window.foo(); // 1
window.obj.foo(); // 10

这段代码和上面的那段代码几乎是一样的,但是这里的this为什么不是指向window,如果按照上面的理论,最终this指向的是调用它的对象。

这里先不解释为什么上面的那段代码this为什么没有指向window,我们再来看一段代码。

window.a = 1; || var a = 1;
function foo() {
    console.log(this.a)
}
var obj = {
    a : 10,
    b: {
        a: 20,
        foo: foo
    }
}
foo(); // 1
obj.b.foo(); // 20

这里同样也是对象obj调用,但是同样this并没有执行它,那你肯定会说我一开始说的那些不就都是错误的吗?

其实也不是,只是一开始说的不准确,接下来我将补充一句话,我相信你就可以彻底的理解this的指向的问题。

情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window(这里不讨论严格模式)。

情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。

window.a = 1; || var a = 1;
function foo() {
    console.log(this.a)
}
var obj = {
    a : 10,
    b: {
        // a: 20,
        foo: foo
    }
}
foo(); // 1
obj.b.foo(); // undefined

尽管对象b中没有属性a,这个this指向的也是对象b(因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西)。

特殊一点的例子:

window.a = 1; || var a = 1;
function foo() {
    console.log(this.a)
}
var obj = {
    a : 10,
    b: {
        a: 20,
        foo: foo
    }
}
foo(); // 1
let f = obj.b.foo;
f(); // 1

这里this指向的是window,是不是有些蒙了?其实是因为你没有理解一句话,这句话同样至关重要。

this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的。

3.显示绑定

在我们刚刚的隐式绑定中有一个致命的限制,就是上下文必须包含我们的函数 ,例:

function foo() {}

let obj = {
   foo: foo
}

如果上下文不包含我们的函数用隐性绑定明显是要出错的,不可能每个对象都要加这个函数,那样的话扩展,维护性太差了,我们接下来聊的就是直接 给函数强制性绑定this。

3-1.call、apply

这里我们就要用到 js 给我们提供的函数 call 和 apply,它们的作用都是改变函数的this指向,第一个参数都是 设置this对象。

两个函数的区别:

  1. 除了第一个参数外,call 可以接收一个参数列表。
  2. 除了第一个参数外,apply只接受一个参数数组。

例子:

let a = {
    value: 1
}
function getValue(name, age) {
    console.log(name, age, this.value)
}
getValue.call(a, 'an', '21') // an 21 1
getValue.apply(a, ['an', '21']) // an 21 1

手写实现call、apply

可以从以下几点来考虑如何实现

1.不传入第一个参数,那么默认为window

2.改变了this指向,让新的对象可以执行该函数。那么思路是否可以变成给新的对象添加一个函数,然后在执行完以后删除?

call实现:

// 往Function原型链添加对象
Function.prototype.myCall = function(conext) {
    var context = conext || window;

    // 给context添加一个属性
    // getValue.myCall(a, 'an', '21') => a.fn = getValue
    context.fn = this;

    // 将 context 后面的参数取出来
    var args = [];
    var len = arguments.length;
    for(var i = 1; i < len; i++) {
        args.push('arguments[' + i + ']');
    }
    // 简易写法 var args = [...arguments].slice(1)

    // getValue.myCall(a, 'an', '21') => a.fn('an', '21')
    var result = eval('conext.fn(' + args + ')');
    
    // 删除fn
    delete conext.fn;
    return result;
}

let a = {
    value: 1
};
function getValue(name, age) {
    console.log(name, age, this.value);
}

getValue.myCall(a, 'an', '21'); // an 21 1

getValue.call(a, 'an', '21'); // an 21 1
getValue.apply(a, ['an', '21']); // an 21 1

简易版本(ES6)

// 往Function原型链添加对象
Function.prototype.myCall = function(context, ...args) {
    var context = context || window;
    context.fn = this;

    // console.log(args); // [ 'an', '21' ]
    console.log(context);

    var result = eval('context.fn(...args)');

    delete context.fn;
    return result;
}


let a = {
    value: 1
};
function getValue(name, age) {
    console.log(name, age, this.value);
}

getValue.myCall(a, 'an', '21'); // an 21 1

getValue.call(a, 'an', '21'); // an 21 1
getValue.apply(a, ['an', '21']); // an 21 1

apply实现:

// 往Function原型链添加对象
Function.prototype.myApply = function(conext) {
    var context = conext || window;
    context.fn = this;

    var result;
    // 需要判断是否存储第二个参数
    // 如果存在,就将第二个参数展开
    if (arguments[1]) {
        result = context.fn(...arguments[1]);
    } else {
        result = context.fn();
    }

    delete conext.fn;
    return result;
}

let a = {
    value: 1
};
function getValue(name, age) {
    console.log(name, age, this.value);
}

getValue.myApply(a, ['an', '21']); // an 21 1

getValue.call(a, 'an', '21'); // an 21 1
getValue.apply(a, ['an', '21']); // an 21 1

简易版本(ES6)

// 往Function原型链添加对象
Function.prototype.myApply = function(context, args) {
    var context = context || window;
    context.fn = this;

    console.log(args); // [ 'an', '21' ]
    var result = eval('context.fn(...args)');

    delete context.fn;
    return result;
}


let a = {
    value: 1
};
function getValue(name, age) {
    console.log(name, age, this.value);
}

getValue.myApply(a, ['an', '21']); // an 21 1

getValue.call(a, 'an', '21'); // an 21 1
getValue.apply(a, ['an', '21']); // an 21 1

3-2.bind

例子:

let a = {
    value: 1
};
function getValue(name, age) {
    console.log(name, age, this.value);
}
var test = getValue.bind(a); // bind会返回一个函数
test("an", 21); // an 21 1

bind和其他两个方法(call、apply)作用也是一致的,只是该方法会返回一个函数。

对于普通函数,绑定this指向。

对于构造函数,要保证原函数的原型对象上的属性不能丢失。

bind实现:

Function.prototype.myBind = function(context) {
    // 异常处理
    if (typeof this !== "function") {
        throw new TypeError("Error");
    }

    // 保存this的值,它代表调用 bind 的函数
    var _this = this;
    var args = [...arguments].slice(1);

    // 返回一个函数
    return function F() {
        // 因为返回一个函数,我们可以new F(),所以需要判断(F的原型在this原型链中)
        if (this instanceof F) {
            return new _this(...args, ...arguments);
        }
        return _this.apply(context, args.concat(...arguments));
    };
};
let a = {
    value: 1
};
function getValue(name, age) {
    console.log(name, age, this.value);
}
var test = getValue.bind(a); // bind会返回一个函数
test("an", 21); // an 21 1

var test2 = getValue.myBind(a); // myBind会返回一个函数
test2("an", 21); // an 21 1

3-3.new绑定

什么是new?

js的new和面向对象(OOP)语言的new的作用都是 创建一个新的对象,但是他们的机制完全不同。

OOP:

创建一个新对象要经过构造函数(constructor),new 类名()会先调用类中的构造函数。

js:

js中只要用new装饰的函数就是构造函数(constructor),准确来说是函数的构造调用(因为js中不存在所谓的构造函数,ES6除外)。

js在new()过程中做了什么?

1. 新生成一个对象
2. 链接到原型(把这个新对象的__proto__属性指向 原函数的prototype属性)
3. 绑定this
4.返回新对象

例子:

function foo(){
    this.a = 10;
    console.log(this);
}

foo(); // window对象
console.log(window.a); // 10 默认绑定

var obj = new foo(); // foo{ a : 10 }  创建的新对象的默认名为函数名

// console.log(obj); // foo { a : 10 }
console.log(obj.a); // 10

使用new调用函数后,函数会 以自己的名字 命名 和 创建 一个新的对象,并返回。

特别注意 : 如果原函数返回一个对象类型,那么将无法返回新对象,你将丢失绑定this的新对象,例子:

function foo(){
    this.a = 10;
    return new String("an");
}
var obj = new foo();
console.log(obj.a); // undefined
console.log(obj); // "an"

看手写new例子,会很直观的认识它做的4步操作

function myNew() {
    // 创建一个空的对象
    let obj = new Object()
    // 获得构造函数
    let Con = [].shift.call(arguments)
    // 链接到原型
    obj.__proto__ = Con.prototype
    // 绑定 this,执行构造函数
    let result = Con.apply(obj, arguments)
    // 确保 new 出来的是个对象
    return typeof result === 'object' ? result : obj
}

对于实例对象来说,都是通过new产生的,无论是function foo() 还是 let a = {b: 1}。

对于创建一个对象来说,更推荐使用字面量的方式创建对象(无论性能上还是可读性)。因为你使用new Object的方式创建对象需要通过作用域链一层一层找到Object,但是你使用字面量方式就没有这个问题。

function foo() {}
// function 就是个语法糖
// 内部等同于 new Function()

let a = { b: 1 }
// 这个字面量内部也是使用了 new Object()

对new来说,还需要注意下运算符优先级

function foo() {
    return this;
}
foo.getName = function () {
    console.log('1');
};
foo.prototype.getName = function () {
    console.log('2');
};

new foo.getName();   // -> 1
new foo().getName(); // -> 2

从上图可以看出 new foo() 的优先级大于 new foo,所以对于上述代码来说可以这样划分执行顺序

function foo() {
    return this;
}
foo.getName = function () {
    console.log('1');
};
foo.prototype.getName = function () {
    console.log('2');
};

new (foo.getName()); // 1

// 分割线

function foo() {
    return this;
}
foo.getName = function () {
    console.log('1');
};
foo.prototype.getName = function () {
    console.log('2');
};

(new foo()).getName(); // 2

对于第一个函数来说,先执行了 foo.getName() ,所以结果为 1

对于后者来说,先执行 new foo() 产生了一个实例,然后通过原型链找到了 foo 上的 getName 函数,所以结果为 2。 

4.this绑定优先级

new绑定->显示绑定->隐式绑定->默认绑定

参考:

《你不知道的javascript》上卷

https://segmentfault.com/a/1190000011194676

https://www.cnblogs.com/pssp/p/5216085.html

https://juejin.im/post/5b14d0b4f265da6e60393680

https://yuchengkai.cn/docs/frontend/#new

http://47.98.159.95/my_blog/js-api/003.html

JavaScript中的this深度剖析 & 对于爬虫扣加密代码的影响 阅读详情

相关推荐

21天精通JavaScript完整学习计划

JavaScript 是一种高级的、解释型的编程语言,它被广泛用于网页的动态交互设计。作为Web开发的核心技术之一,JavaScript与HTML和CSS共同构建了丰富多彩的互联网世界。数组是用于存储有序集合的一种数据结构。在JavaScript中,数组是特殊的对象,用于存储元素集合。数组通过数组字面量或构造函数创建:数组的元素可以通过索引访问,JavaScript数组索引是从0开始的:// 输出: Banana数组有许多内置方法来进行操作,比如push()pop()

weixin_42515392的博客 753

Javascript中的this(二)

接着上一章继续讲,还有两个this的绑定规则就是显式绑定和new绑定。 显式绑定 顾名思义,显式绑定意思就是明确的将某个对象绑定到this上,我们知道Javascript有三个API:apply,call,bind。他们的共同作用就是手动改变this指向。来看栗子: function foo() { console.log('foo函数调用',this) } foo() 此时调用foo函数,this指向window对象没毛病。如果我想将this指向为obj对象怎么办,一种方法是在

军火库 119

ArcGIS山体坡度、坡向分析

本篇文章主要记录自己在对山体坡向及坡度分析中的一些操作。

Belence_zhao的博客 7411

js原型笔记

目录 1.new 的过程 2. __proto__属性 3.prototype属性 4.constructor属性 5. 原型继承 new的过程 function Foo() {...}; let f1 = new Foo(); 上面代码首先创建一个构造函数Foo(),并用new操作符来生成了一个实例对象f1。 new 会劫持所有普通函数并用构造对象的形式来调用它。...

tang_1227的博客 360

麒麟V10系统命令实战指南:从入门到精通

本文为麒麟V10操作系统用户提供了一份从入门到精通的命令行实战指南。内容涵盖文件管理、进程监控、网络诊断、文本处理及系统管理等核心场景,旨在帮助用户转变思维,掌握高效解决实际问题的系统命令技巧,从而提升在麒麟V10环境下的运维与工作效率。

sat99的博客 594

ROS2 Jazzy 学习路线图(2026最新)

摘要: ROS2 Jazzy(LTS版)是2026年长期支持版本,仅适配Ubuntu 24.04。本文提供WSL环境下的学习路线图: 环境搭建(1-2天):配置WSL2+Ubuntu 24.04,安装ROS2 Jazzy及图形工具(VcXsrv、VS Code)。 核心概念(3-5天):掌握节点、话题、服务等通信机制,使用turtlesim和小海龟仿真实践。 开发实战(7-10天):Python/C++节点开发,结合RViz2、Gazebo等工具完成多节点通信和避障项目。 进阶应用(10-15天):导航(N

zheng_ruiguo的专栏 637

深入理解ES6 -- 函数

前言函数是所有编程语言的重要组成部分, 在 ES6 出现前,JavaScript 的函数语法一直没有太大的变化 , 从而遗留了很多问题和隐晦的做法,导致一些基本功能经常要编写很多代码. 例如定义一个类 要用到安全模式,做检测.函数默认参数如何赋值等问题.1.函数形参的默认参数JavaScript 函数有一个特别的地方,无论函数定义中声明了多少形参,都可以传入任意多个参数,由于这个原因,JavaScrip

1451

Open3D 从体素网格构建八叉树【2025最新版】

从体素网格构建八叉树,博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 34万+

认识javascript原型链

函数的原型对象 JavaScript的函数内部有两个不同的内部方法 [[call]]和[[Construct]] 在介绍二者之前先说一下函数的原型对象,函数本身有一个原型对象,这个对象用于判定函数的类别。 以Object为例: console.log('Object.prototype :>> ', Object.prototype); // Object.prototype :>> {} 打印的结果是一个空对象,但如果换一个普通的方法,会发现打印结果有些许的不一样 functi

u010464354的博客 913

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 390

ArcGIS Pro 制作这种地图海报

ArcMap 版本与 ArcGIS Pro 版本的制图功能相差太多,无论从美观上还是制图效率都远远优于 ArcMap,用了一段时间的 ArcGIS Pro ,真心推荐有条件的大家赶紧试一试!一个软件也能搞定一张不错的海报哦!----吐槽:好的设计真的是门花时间的活,这个教程大概花了我7小时左右,我都忘了我自己教程中截图多少张了!(可能是我速度太慢了)测试数据:阿里云盘分享-----北极海冰数据.https://www.aliyundrive.com/s/SUhsnqfkmXh。

J_Giser的博客 1427

JavaScript 快速入门手册

JavaScript是一门解释型语言,所谓解释型指语言是指不需要被编译为机器码在执行,而是直接浏览器|node中执行。JavaScript中每一个函数对象都存在一个隐藏的对象属性:prototype原型对象函数以普通函数调用,prototype没有任何作用函数以构造函数调用,new 构造函数(...);

慈様 2万+

092、Python在芯片验证中的应用:从脚本小子到验证架构师

Python在芯片验证中的高效应用 本文通过实际案例展示了Python在芯片验证中的关键作用。凌晨三点的调试场景揭示了传统方法的局限,Python脚本能在20分钟内分析80GB波形数据定位FIFO指针问题。文章重点介绍了两个核心工具: 智能日志分析系统:通过正则表达式和上下文分析,自动分类百万行验证日志中的错误,生成可视化报告,效率远超传统grep方法。 寄存器模型生成器:将Excel表格自动转换为UVM寄存器模型代码,将原本需要两周的手工工作缩短至两小时,同时保证零错误。 文章还展示了Python与Sys

z534437748的博客 72

深入浅出 JavaScript 关键词 -- this

原文地址:Mastering JavaScript this Keyword – Detailed Guide 原文作者:Jay 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:老教授 校对者:allen、dz 要说 JavaScript 这门语言最容易让人困惑的知识点,this 关键词肯定算一个。JavaScript 语言面世多年,一直...

Jeff的博客 368

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5550

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

V少JS基础班之第八弹:this

this,this的五种绑定

优快云_Xying的博客 1002

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

阅读周·你不知道的JavaScript | 深入JavaScript,坚固的基础是点滴构造起来的

背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读三个月。4月份的阅读计划有两本,《你不知道的JavaScrip》系列迎...

jiaworld的博客 622

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

涅槃重生(一):JS中this的那些事

前言 经历了一年多的各种尝试之后,最终还是决定回到程序员的行列中来。一年中的许许多多事情不是由我自己主动结束就是最终走向了失败幻灭。 从小开始教科书就教育我们做人不能三心二意、眼高手低,成功露出水面的诀窍也只能是他们在水面下苦苦构筑的巨大冰山。回想从一开始起,就是以工程化为目的,奉行拿来主义,大部分情况下不知道自己放置于工程中的部分代码所引用的库中究竟是用什么手法达到我想要的目的的。 故以此为契机...

Clancy's secret garden 237

挑战百日学习计划(南宁小程序开发)第21天(javascript this)

恭喜自己!最近谈下一单【小程序开发:www.zkelm.com】,非常开心,费用2w元,可以松一口气了,公司这个月有事情做了。而我又可以花时间学习升级一下自己, 今天的知识点: this javascript This 关键字,指的是他的对象 1.在方法中,this 指的是所有者对象 person={ firstName:"南宁小程序开发", lastName:"www.zkelm.com", fullName:function(){ return this.firstName+

小程序开发|oa系统|网站开发 306

JS小册之通过对象走进this和原型

1.什么是对象 (1)ECMAScript没有类的概念,因此他的对象和基于类的语言中的对象有所不同。ECMA-262把对象定义成:“无序属性的集合,其属性值可以包含基本值、对象或者函数。"我们知道对象都是基于一个引用类型创建的,在第五章中我们学习了一些原生类型,如Array类型、Date类型等,但是除此之外开发人员也可以自己定义新的类型。 我们上一章了解了Object类型,他不具备多少功能,但是对应用程序中存储和传输数据而言,是一个很好的选择。我们采用对象字面量语法可以定义一个person类型,如下: va

weixin_43950142的博客 367

java this call_Java程序猿的JavaScript学习笔记(3——this/call/apply)

计划按例如以下顺序完毕这篇笔记:这是笔记的第3篇,聊聊JavaScript中的this。还有两种调用函数的特殊方式:call 和 apply。转载请取得作者允许thisJavaScript中的this和Java中的this差别较大。学过Java的童鞋请忘掉你知道的关于this的一切。JavaScript中的this是依赖于函数的。表示函数的调用者。有两个意思:第一,this不是函数本身;第二。函数...

weixin_35738304的博客 140

Front End Interview Handbook 精读:事件委托、this、原型继承、null/undefined 与闭包——JavaScript 面试必会五大概念全解析

> 本篇文章以当前仓库 front-end-interview-handbook 中西班牙语版 JavaScript 面试问答文档为主线,围绕五道高频基础面试题——事件委托(delegación de eventos)、`this` 的绑定规则、原型链继承、`null`/`undefined`/undeclared 三种空值与闭包(closure)——逐题展开深度解析。读完本文,你将不仅掌握每一题

gitblog_00151的博客 252

Traduccion项目完全指南:如何参与You Don‘t Know JS西班牙语翻译

Traduccion项目是GitHub加速计划中的重要组成部分,致力于将Kyle Simpson的经典JavaScript系列书籍"You Don't Know JS"翻译成西班牙语,为全球西班牙语读者提供高质量的JavaScript学习资源。无论你是JavaScript新手还是有经验的开发者,都可以通过参与翻译贡献自己的力量,同时深化对JavaScript的理解。 ## 📚 项目简介:为什么

gitblog_00639的博客 944

从BANKI到Offer:30天面试准备计划与资源推荐

GitHub 加速计划(BANKI)是一个全面的技术面试准备项目,包含了面试中常见的行为问题、技术问题、算法题以及面试技巧等资源。本文将为你提供一个高效的30天面试准备计划,帮助你充分利用BANKI项目中的资源,全面提升面试能力,顺利拿到心仪的Offer。 ## 📅 30天面试准备计划:科学规划,高效提升 ### 第1-5天:夯实基础,梳理知识体系 在面试准备的初期,建立完整的知识框架至关重

gitblog_00420的博客 666

javascript中的this

this值在JavaScript中也比较关键,不同的场景代表不同的值。理解是关键 全局上下文 this对象直接指向全局对象,在浏览器中也就是window对象。这个比较好理解 函数上下文 在函数中,this对象的情况就比较多了: 1、直接调用函数 this指向window对象,但是在严格模式下,返回undefined 2、当函数作为一个对象的方法来调用的...

Cassie's blog 234
上一篇: 深入javascript计划三:javascript编译器、引擎、作用域介绍
下一篇: 深入javascript计划五:深入浅出原型
An_s
博客等级 码龄10年 665粉丝 363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值