小编Cer*_*nce的帖子

如何避免意外地隐式引用全局对象上的属性?

是否可以在没有with(global)所有脚本默认具有的隐式上下文的情况下执行代码块?例如,在浏览器中,是否可以通过任何方式设置脚本,使诸如

const foo = location;
Run Code Online (Sandbox Code Playgroud)

抛出

未捕获ReferenceError:未定义位置

而不是访问window.location,何时location未先声明?缺少这一点,有没有办法使这种隐式引用导致某种警告?在编写代码时,它可能是错误的来源(见下文),因此有一种防范它的方法可能会很有用。

(当然,由于普通的作用域规则,可以使用constlet或在内部块中声明另一个具有相同名称的变量,以确保使用该变量名称引用的是新变量而不是global属性,但这不是一样。)

这可能类似于询问是否可以从实际 with语句中停止引用属性:

const obj = { prop: 'prop' };
with (obj) {
  // how to make referencing "prop" from somewhere within this block throw a ReferenceError
}
Run Code Online (Sandbox Code Playgroud)

众所周知,with不应该首先使用它,但是不幸的是,当谈到时,我们似乎别无选择with(global),因为它偶尔会节省一些字符,但会浪费一些经常弹出的错误:1 2 3 4 5 6。例如:

(这里的问题:window.status是保留属性-分配给它时,它会将分配的表达式强制转换为字符串)

with阻止或禁止显式使用此类错误的原因相同,但with(global)即使在严格模式下,隐式错误也继续引起问题,因此找出解决方法将非常有用。

javascript scope with-statement

11
推荐指数
1
解决办法
511
查看次数

为什么 onerror 不拦截来自 promise 和 async 函数的异常

我想使用 onerror 来拦截和记录我的 JavaScript 应用程序中发生的所有错误。这按预期工作,除非使用承诺或异步函数。

下面通过剪断抛出的异常fail如预期,但被拦截rejectPromisethrowAsync的不是调用的onerror处理程序总是显示一个Uncaught (in promise) Error控制台?

如何始终拦截使用 promise 和异步函数的代码库中的所有错误?

window.onerror = function(message, source, lineno, colno, error) {
  console.log('onerror handler logging error', message);
  return true;
}

function rejectPromise() {
  return Promise.reject(new Error('rejected promise'));
}

async function throwAsync() {
  throw new Error('async exception');
}

function fail() {
  throw new Error('exception');
}

rejectPromise().then(() => console.log('success'));
throwAsync();
fail();
Run Code Online (Sandbox Code Playgroud)

javascript onerror promise

11
推荐指数
1
解决办法
1719
查看次数

功能和可变提升的意外结果

我正在读"你不懂JS"系列的第二本书,我读过在变量之前函数被提升了.

所以这是代码:

foo(); // 1

var foo;

function foo() {
    console.log( 1 );
}

foo = function() {
    console.log( 2 );
};
Run Code Online (Sandbox Code Playgroud)

这个输出将是1.但为什么呢?首先提升函数,然后提升变量.因此,在我的函数foo(打印1的那个)被提升之后,它必须跟随变量foo.所以结果应该是"未定义"而不是"1".

我希望代码的行为就像它一样:

// hoisted first
function foo() {
    console.log( 1 );
}

// hoisted second
var foo;  // implicitly initialized to 'undefined'

foo();  // call 'undefined' - error?

foo = function() {
    console.log( 2 );
};
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?

javascript hoisting

9
推荐指数
1
解决办法
237
查看次数

有没有办法将现有的Javascript对象转换为数组而不创建新的单独数组?

在differentes读数上有很多提及数组是Javascript中特殊的对象类.例如这里:

https://www.codingame.com/playgrounds/6181/javascript-arrays---tips-tricks-and-examples

所以,由于objecta是属性(或键)和值的集合,我在想是否有一种方法可以从一个对象开始并以一个数组结束(从某种意义上说,该方法Array.isArray()返回true该对象模拟一个数组) .我已经开始查看数组属性:

let arr = [0, 1, 2, 3, 4, 5];
console.log(Object.getOwnPropertyNames(arr));
console.log(Array.isArray(arr));
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用一个对象来模拟相同的东西:

let arrEmulation = {0:0, 1:1, 2:2, 3:3, 4:4, 5:5, "length":6};
console.log(Object.getOwnPropertyNames(arrEmulation));
console.log(Array.isArray(arrEmulation));
Run Code Online (Sandbox Code Playgroud)

Array.isArray(arrEmulation)仍然回归false.首先,我想道歉,如果这是一个愚蠢的问题,但有没有办法我可以手动转换objectarray添加特殊属性(或键)

请注意,我不想知道如何将对象转换为数组,我只想了解哪些特殊的东西可以解释像数组这样的对象.

javascript arrays object

9
推荐指数
1
解决办法
549
查看次数

Angular 5 Form脏支票

我有一些表格和按钮来保存它。仅当表单上有未保存的更改(输入)时,才必须启用该按钮。

<form>
    <div>
    ... (inputs)
        <span (click)="save()"> Save </span>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

Angular 5中有一些内置的表单脏检查机制吗?实施此方案的最简单方法是什么?

html javascript angular angular5

7
推荐指数
2
解决办法
3万
查看次数

AWS Lambda提前结束(没有任何显式返回或回调)

我在使用一些node.js代码时遇到了一些问题,我将其放入AWS Lambda.我需要做几个异步调用,虽然第一个是我期望的行为,但lambda函数在第二个调用完成之前终止.

返回值为null,这让我认为lambda正在触及它的隐式回调,但是我认为它不应该这样做,而有一个尚未解决的承诺.

码:

exports.handle = async function(event, context) {
  var AWS = require("aws-sdk");

  AWS.config.update({
    region: "eu-west-1",
    endpoint: "dynamodb.eu-west-1.amazonaws.com"
  });

  var docClient = new AWS.DynamoDB.DocumentClient();
  console.log("Scanning Catalogue...");

  var params = {
    TableName : "Catalogue"
  };

  await docClient.scan(params).promise().then(function (data) {
    console.log("Scan succeeded.");
    data.Items.forEach(function (item) {
      //console.log(item.url);
      checkIfUpdateRequired(item);
    })
  })
}

async function checkIfUpdateRequired (catalogueItem) {
  var request = require("request-promise");
  console.log("Getting " + catalogueItem.url);

  await request(catalogueItem.url).then(function(response) {
    console.log(response.statusCode);
    console.log(response.headers['content-type']);
  });

}
Run Code Online (Sandbox Code Playgroud)

日志输出:

START RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1 Version: $LATEST
2018-05-28T09:20:44.425Z    634a55b7-6258-11e8-9f18-6b300c3b5de1    Scanning Catalogue...
2018-05-28T09:20:45.446Z …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services node.js promise aws-lambda

7
推荐指数
1
解决办法
1156
查看次数

匹配具有唯一数字的字母数字单词(NOT NUMERIC-ONLY单词)

使用正则表达式,我想只选择以下单词:

  • 是字母数字
  • 不包含数字
  • 不包含字母表
  • 有唯一的数字(1或更多)

我对正则表达式并不是很好,但到目前为止,我已经尝试过[^\d\s]*(\d+)(?!.*\1),这使我无法接近所需的输出:(

以下是输入字符串:

I would like abc123 to match but not 123.
ab12s should also match
Only number-words like 1234 should not match
Words containing same numbers like ab22s should not match
234 should not match
hel1lo2haha3hoho4
hel1lo2haha3hoho3
Run Code Online (Sandbox Code Playgroud)

预期比赛:

abc123
ab12s
hel1lo2haha3hoho4
Run Code Online (Sandbox Code Playgroud)

javascript regex

7
推荐指数
1
解决办法
145
查看次数

访问导出变量的更改值

我有一个模块“a”,它导出一个作为null. 这个变量被导入到模块“b”中。

在对初始变量进行一些更改后,我尝试从模块“b”再次访问它,结果发现我获得了原始null值。

这些变量不是作为参考导入的吗?意思是,它们应该反映在运行时稍后对它们所做的任何更改。

// main.js
import * as a from './a.js'
import * as b from './b.js'

// a.js
let test = null
export default test

export function change() {
  test = 'test'
  console.log(['in a.js change()', test])
}
console.log(['in a.js global', test])

// b.js
import test, { change } from './a.js'

console.log(['in b.js, pre a.change()', test])
change()
console.log(['in b.js, post a.change()', test])


/*
output:
Array [ "in a.js global", null ]
Array [ "in b.js, …
Run Code Online (Sandbox Code Playgroud)

javascript es6-modules

7
推荐指数
1
解决办法
2032
查看次数

获取网站的活动 Websockets 可能吗?

我想知道是否有可能获得网站的活动 WebSocket。一个例子是:var x = document.findWebSocket()。websockets 将列在 Chrome 的网络选项卡下(在开发工具部分)。从那里 websockets 列在“WS”下。我也希望能够做到x.emit(..);

到目前为止,我只能想出var x = new WebSocket("wss://exampleUrl.com/socket.io/?EIO=3&transport=websocket", "protocol1");. 但这只会添加一个新的 Websocket,其 sid 与我想从中发出消息的 sid 不同。

添加“&sid = {SID of Active Websocket}”是行不通的。

javascript sockets websocket socket.io

7
推荐指数
2
解决办法
1822
查看次数

合并对象并删除属性

假设我有一个这样结构的对象数组

"err": [
    {
        "chk" : true,
        "name": "test"
    },
    {
        "chk" :true
        "post": "test"
    }
]
Run Code Online (Sandbox Code Playgroud)

我怎样才能像这样重新构建它:

"err": [
    {
        "post": "test"
        "name": "test"
    }
]
Run Code Online (Sandbox Code Playgroud)

我试过

arr.filter(obj => delete obj.chk);
Run Code Online (Sandbox Code Playgroud)

它可以成功删除该chk属性,但是如何将两个对象合并?

javascript arrays

7
推荐指数
1
解决办法
309
查看次数